- 論壇徽章:
- 0
|
諸位,請(qǐng)教一下,
在一個(gè)64位的機(jī)器上,
rax有一個(gè)64的值(高4字節(jié)非0),
執(zhí)行下面的語(yǔ)句
mov %eax, %eax
之后,為什么rax的高4個(gè)字節(jié)被清零了,
我dump出來(lái)看
mov %eax, %eax
對(duì)應(yīng)
89 C0
根據(jù) 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
也就是說(shuō):第一個(gè)操作數(shù)是 EAX/AX/AL/MM0/XMM0 之一
第二個(gè)操作數(shù)是:
AL
AX
EAX
MM0
XMM0 之一
我看該手冊(cè)對(duì)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.
我想問(wèn)的是,
1、從mov %eax, %eax語(yǔ)句來(lái)看,怎么確定操作數(shù)的size,畢竟他把rax的高4字節(jié)搞沒(méi)了;
2、從89 C0來(lái)看,怎么知道他是用EAX這個(gè)寄存器的呢?為什么不可能是MM0,XMM0呢?
小弟一直沒(méi)有把這些搞明白過(guò),64的匯編更是一頭霧水,
有哪位明白的大俠給講解一下。
忘了說(shuō),實(shí)在Suse 9上,gcc是3.3版本,那句匯編指令(mov %eax, %eax)
是gcc自己生成的,搞不懂她為什么不加上b,w,l,q等后綴呢? |
|