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

汇编语言64位加法和减法

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

如同 32 位模式下一样,ADD、SUB、INC 和 DEC 指令在 64 位模式下,也会影响 CPU 状态标志位。在下面的例子中,RAX 寄存器存放一个 32 位数,执行加 1,每一位都向左产生一个进位,因此,在位 32 生成 1:

  • mov rax, 0FFFFFFFFh ;低 32 位是全 1
  • add rax,1 ; RAX = 100000000h

需要时刻留意操作数的大小,当操作数只使用部分寄存器时,要注意寄存器的其他部分是没有被修改的。如下例所示,AX 中的 16 位总和翻转为全 0,但是不影响 RAX 的高位。这是因为该操作只使用 16 位寄存器(AX 和 BX):

  • mov rax,0FFFFh ; RAX = 000000000000FFFF
  • mov bx, 1
  • add ax,bx ; RAX = 0000000000000000

同样,在下面的例子中,由于 AL 中的进位不会进入 RAX 的其他位,所以执行 ADD 指令后,RAX 等于 0:

  • mov rax,0FFh ; RAX = 00000000000000FF
  • mov bl, 1
  • add al,bl ; RAX = 0000000000000000

减法也使用相同的原则。在下面的代码段中,EAX 内容为 0,对其进行减 1 操作,将会使得 RAX 低 3 2位变为 -1(FFFFFFFFh)。同样,AX 内容为 0,对其进行减 1 操作,使得 RAX 低 16 位等于 -1(FFFFh)。

  • mov rax,0 ; RAX = 0000000000000000
  • mov ebx, 1
  • sub eax,ebx ; RAX = 00000000FFFFFFFF
  • mov rax,0 ; RAX = 0000000000000000
  • mov bx,1
  • sub ax,bx ; RAX = 000000000000FFFF

当指令包含间接操作数时,必须使用 64 位通用寄存器。记住,一定要使用 PTR 运算符来明确目标操作数的大小。下面是一些包含了 64 位目标操作数的例子:

  • dec BYTE PTR [rdi] ;8 位目标操作数
  • inc WORD PTR [rbx] ;16 位目标操作数
  • inc QWORD PTR [rsi] ;64 位目标操作数

64 位模式下,可以对间接操作数使用比例因子,就像在 32 位模式下一样。如下例所示,如果处理的是 64 位整数数组,比例因子就是 8:

  • .data
  • array QWORD 1,2,3,4
  • .code
  • mov esi, 3 ;下标
  • mov rax,array[rsi*8] ; RAX = 4

64 位模式的指针变量包含的是 64 位偏移量。在下面的例子中,ptrB 变量包含了数组 B 的偏移量:

  • .data
  • arrayB BYTE 10h, 20h, 30h, 40h
  • ptrB QWORD arrayB

或者,还可以用 OFFSET 运算符来定义 ptrB,使得这个关系更加明确:

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