• 汇编语言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 码字符串是一种特殊情况,因为它们总是包含字节。一般在处理时,采用间接或变址寻址。

更多...

加载中...