Skip to content

Latest commit

 

History

History
55 lines (42 loc) · 2.28 KB

3.04.md

File metadata and controls

55 lines (42 loc) · 2.28 KB

运算指令

指令 效果 描述
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

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字