# 3.5 算术和逻辑操作
图 3-10 列出了 x86-64 的一些整数和逻辑操作。大多数操作都分成了指令类,这些指令类有各种带不同大小操作数的变种(只有 leaq 没有其他大小的变种)。例如,指令类 ADD 由四条加法指令组成:addb、addw、addl 和 addq,分别是字节加法、字加法、双字加法和四字加法。事实上,给出的每个指令类都有对这四种不同大小数据的指令。
这些操作被分为四组:加载有效地址、一元操作、二元操作和移位。二元操作有两个操作数,而一元操作有一个操作数。这些操作数的描述方法与 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 格式的汇编代码中的相反