3.5 算术和逻辑操作

3.5 算术和逻辑操作

图 3-10 列出了 x86-64 的一些整数和逻辑操作。大多数操作都分成了指令类,这些指令类有各种带不同大小操作数的变种(只有 leaq 没有其他大小的变种)。例如,指令类 ADD 由四条加法指令组成:addbaddwaddladdq,分别是字节加法、字加法、双字加法和四字加法。事实上,给出的每个指令类都有对这四种不同大小数据的指令。

这些操作被分为四组:加载有效地址、一元操作、二元操作和移位。二元操作有两个操作数,而一元操作有一个操作数。这些操作数的描述方法与 3.4 节中所讲的一样。

指令 效果 描述
leaq S, D D ← &S 加载有效地址
INC D D ← D + 1 加 1
DEC D D ← D - 1 减 1
NEG D D ← -D 取负
NOT D D ← ~D 取补
ADD S, D D ← D + S
SUB S, D D ← D - S
IMUL S, D D ← D * S
XOR S, D D ← D ^ S 异或
OR S, D D ← D | S
AND S, D D ← D & S
SAL k, D D ← D << k 左移
SHL k, D D ← D << k 左移(等同于 SAL)
SAR k, D D ← D >>A k 算术右移
SHR k, D D ← D >>L k 逻辑右移

图 3-10 整数算术操作。加载有效地址(leaq)指令通常用来执行简单的算术操作。其余的指令是更加标准的一元或二元操作。我们用 >>A 和 >>L 来分别表示算术右移和逻辑右移。注意,这里的操作顺序与 ATT 格式的汇编代码中的相反