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