算数和逻辑操作

这些指令类有各种不同大小操作数的变种,(只有leaq没有)例如ADD由四条加法指令组成:addb, addw, addl, addq。

指令 效果 描述
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< 左移
SHL k,D D<—D< 左移(等同于SAL)
SAR k,D D<—D>>k 算术右移
SHR k,D D<—D>>k 逻辑右移

注:leaq 是 movq 的变形,将有效地址内容写入寄存器,经常用来做加法和乘法。如 leaq 7(%rdx, %rdx, 4), %rax; 若 %rax 的值为 x ,那么结果为 5X+7

移位操作对w位长的数据值进行操作, 2m=w 2 m = w 。例如对于salq, 26=84 2 6 = 84 ,故只会考虑6位作为位移大小。

特殊的算数操作

x86-64指令集对128位数的操作提供有限支持。Intel把16字节的数称为八字(oct word)。

指令 效果 描述
imulq S R[%rdx]:R[%rax]<—SxR[%rax] 有符号全乘法
mulq S R[%rdx]:R[%rax]<—SxR[%rax] 无符号全乘法
clto R[%rdx]:R[%rax]<—符号扩展(R[%rax]) 转换位八字
idivq S R[%rdx]<—R[%rax]:R[%rax] mod S
R[%rdx]<—R[%rax]:R[%rax] 除 S 有符号除法
divq S R[%rdx]<—R[%rax]:R[%rax] mod S
R[%rdx]<—R[%rax]:R[%rax] 除 S 无符号除法

特殊的算术操作。这些操作提供了有符号和无符号数的全128位乘法和除法。一对寄存器%rdx和%rax组成一个128位的八字

你可能感兴趣的:(汇编)