免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2019 | 回复: 1
打印 上一主题 下一主题

请教大家一句汇编 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-10 22:20 |只看该作者 |倒序浏览
诸位,请教一下,
在一个64位的机器上,
rax有一个64的值(高4字节非0),
执行下面的语句
mov %eax, %eax
之后,为什么rax的高4个字节被清零了,
我dump出来看
mov %eax, %eax
对应
89 C0


根据 Intel 64 and IA-32 Architectures Software Developer's Manual Vol. 2A的描述

89是mov指令的编码
C0因该就是ModR/M,这样分析的话
Mod 是11
Reg/Opcode是000
R/M是000

也就是说:第一个操作数是 EAX/AX/AL/MM0/XMM0 之一
第二个操作数是:
AL
AX
EAX
MM0
XMM0 之一

我看该手册对mov的描述是这样的(Intel 64 and IA-32 Architectures Software Developer's Manual Vol. 2A 3-639)

89 /r MOV r/m16,r16 Valid Valid Move r16 to r/m16.
89 /r MOV r/m32,r32 Valid Valid Move r32 to r/m32.
REX.W + 89 /r MOV r/m64,r64 Valid N.E. Move r64 to r/m64.

我想问的是,
1、从mov %eax, %eax语句来看,怎么确定操作数的size,毕竟他把rax的高4字节搞没了;
2、从89 C0来看,怎么知道他是用EAX这个寄存器的呢?为什么不可能是MM0,XMM0呢?


小弟一直没有把这些搞明白过,64的汇编更是一头雾水,

有哪位明白的大侠给讲解一下。

忘了说,实在Suse 9上,gcc是3.3版本,那句汇编指令(mov %eax, %eax)
是gcc自己生成的,搞不懂她为什么不加上b,w,l,q等后缀呢?

论坛徽章:
0
2 [报告]
发表于 2008-11-10 22:31 |只看该作者
mov %eax,%eax 是不会把高32位清0的。

1、确定 %eax 的大小:加 REX prefix 是64位, 加 66 prefix 是16位,不加prefix是32 位
2、89 这个 opcode 决定使用的是 GPRs
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP