汇编语言64位MOV指令

64 位模式下的 MOV 指令与 32 位模式下的有很多共同点,只有几点区别,现在讨论一下。立即操作数(常数)可以是 8 位、16 位、32 位或 64 位。下面为一个 64 位示例:

mov rax, 0ABCDEF0AFFFFFFFFh ; 64 位立即操作数

当一个 32 位常数送入 64 位寄存器时,目标操作数的高 32 位(位 32—位 63)被清除(等于 0):

mov rax, 0FFFFFFFFh ;rax = 00000000FFFFFFFF

向 64 位寄存器送入 16 位或 8 位常数,其高位也要清零:

mov rax, 06666h  ;清位 16—位 63
mov rax, 055h      ;清位 8—位 63

如果将内存操作数送入 64 位寄存器,则结果是确定的。比如,传送一个 32 位内存操作数到 EAX(RAX 寄存器的低半部分),就会清除 RAX 的高 32 位:

.data
myDword DWORD 80000000h
.code
mov rax,0FFFFFFFFFFFFFFFFh
mov eax,myDword                     ; RAX = 0000000080000000

但是,如果是将 8 位或 16 位内存操作数送入 RAX 的低位,那么,目标寄存器的高位不受影响:

.data
myByte BYTE 55h
myWord WORD 6666h
.code
mov ax,myWord                ;位 16—位 63 不受影响
mov al, myByte                  ;位 8—位 63 不受影响

MOVSXD 指令(符号扩展传送)允许源操作数为 32 位寄存器或内存操作数。下面的指令使得 RAX 的值为 FFFFFFFFFFFFFFFFh:

mov ebx, 0FFFFFFFFh
movsxd rax,ebx

OFFSET 运算符产生 64 位地址,必须用 64 位寄存器或变量来保存。下例中使用的是 RSI 寄存器:

.data
myArray WORD 10,20,30,40
.code
mov rsi,OFFSET myArray

64 位模式中,LOOP 指令用 RCX 作为循环计数器。

有了这些基本概念,就可以编写许多 64 位模式程序了。大多数情况下,如果一直使用 64 位整数变量或 64 位寄存器,那么编程比较容易。ASCII 码字符串是一种特殊情况,因为它们总是包含字节。一般在处理时,采用间接或变址寻址。

匿名

发表评论

匿名网友