- 论坛徽章:
- 0
|
诸位,请教一下,
在一个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等后缀呢? |
|