指令 | 效果 | 描述 |
---|---|---|
leaq S,D | D <- &S | 加载有效地址 |
inc D | D <- D + 1 | 加一 |
dec D | D <- D - 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 | 左移(shl = sal) |
sar k,D | D <- D >> K | 算数右移 |
shl k,D | D <- D >>> K | 逻辑右移 |
leaq 作用是 将 S 作为地址计算出值 放入 D 中.
例如 leaq 7(%rdx,%rdx4,4) , %rax 如果 %rdx 中值为 x
, 则会将 x + 4x + 7
计算放入 %rax
leaq/leal 有一些特殊的用法:
int sum(int x, int y)
{
int t = x + y; //leal (%rcx,%rdx), %eax
accum += t;
return t;
}
一元运算只有一个目的操作数,例如 not D 意味着 将D地址中的值取反并将结果放入D
二元运算符有两个操作数,例如 add S,D 可以理解为 : D += S
- 不存在算数左移和逻辑左移 只有左移
- 对w位数据进行移位操作,由操作数低m位控制,w = 2 ^ m,高位数据将会被忽略,因此当k值寄存器内容为0xFF时, salb 会移位 7, salw移位15, sall移位
指令 | 效果 | 描述 |
---|---|---|
imulq S | R[%rdx] : R[%rax] <- S * R[%rax] | 全乘法(有符号) |
mulq S | R[%rdx] : R[%rax] <- S * R[%rax] | 全乘法(无符号) |
clto S | R[%rdx] : R[%rax] <- R[%rax] | 符号扩展为8字 |