汇编语言64位加法和减法

如同 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
匿名

发表评论

匿名网友