2025年4月14日 星期一 乙巳(蛇)年 正月十五 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 汇编

汇编语言64位MOV指令

时间:03-05来源:作者:点击数:147

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

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门