[原][Assembly] 程序的机器级表示(三):栈指令、算术和逻辑指令

娄泽豪 17/06/02 11:36:21

栈指令

指令效果描述
pushq S %rsp ← %rsp - 8将四字压入栈
(%rsp) ← S
popq D D ← (%rsp)将四字弹出栈
%rsp ← %rsp + 8

需要注意的点

  • pushq指令的行为等价于:subq $8, %rspmovq %rbp, (%rsp)两条指令的合效果。
  • popq指令的行为等价于: movq (%rsp), %raxaddq $8, %rsp两条指令的合效果。
  • push/pop指令不存在其他后缀。

算数和逻辑指令

指令效果描述
leaq S , DD ← &S加载有效地址
inc DD ← D + 1加一
dec DD ← D - 1减一
neg DD ← -D取负
not DD ← ~D取补
add S , DD ← D + S
sub S , DD ← D - S
imul S , DD ← D * S
div S , DD ← D ÷ S
xor S , DD ← D ^ S异或
or S , DD ← D | S
and S , DD ← D & S
sal k , DD ← D << k左移
shl k , DD ← D << k左移(等同于sal)
sar k , DD ← D >>(A) k算数右移
shr k , DD ← D >>(L) k逻辑右移

加载有效地址

加载有效地址指令leaq实质上是movq指令的变形。它的指令形式是从内存读取数据到寄存器,但实际上leaq没有引用内存。他的作用是将内存地址放入操作数中。该命令的目标必须是一个寄存器,同时leaq可以简洁的描述算数运算,所以有时它的使用与有效地址的计算无关。例如:

long scale(long x, long y, long z) {
    long t = x + 4 * y + 12 * z;
    return t;
}
; long scale(long x, long y, long z)
; x in %rdi, y in %rsi, z in %rdx
scale:
    leaq (%rdi, %rsi, 4), %rax    ; x + 4 * y
    leaq (%rdx, %rdx, 2), %rdx    ; z + 2 * z
    leaq (%rax, %rdx, 4), %rax    ; (x + 4 * y) + 4 * (3 * z)

特殊的算数指令

指令 效果 描述
imulq S %rdx : %rax ← S × (%rax) 有符号全乘法
mulq S %rdx : %rax ← S × (%rax) 无符号全乘法
clto %rdx : %rax ← 符号扩展(%rax) 扩展为八字
idivq S %rdx ← (%rdx) : (%rax) mod S 有符号除法
%rdx ← (%rdx) : (%rax) ÷ S
divq S %rdx ← (%rdx) : (%rax) mod S 无符号除法
%rdx ← (%rdx) : (%rax) ÷ S
作者:hepangda 发表于2017/6/2 11:36:21 原文链接
阅读:23 评论:0 查看评论