算术和逻辑指令分四种:leal指令、一元操作、二元操作、移位操作。
指令 效果 描述
leal S,D D<&S 加载有效地址
INC D D<-D+1 加1
DEC D D<-D-1 减1
DEG D D<- -D 取负
NOT D D<- ~D 取补
ADD S,D D<-D+S 加
SUB S,D D<-D-S 减
LMUL 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>>Ak 算术右移SHR k,D
D<- D>>Lk 逻辑右移
注解:leal指令实际是mov的变形,指令形式是从存储器到寄存器,实际上没有引用存储器。作用是
将有效地址写入目的操作数。目的数必须是寄存器。
一元操作只有一个操作数,既是源又是目标数。
二元操作,两个操作数,第一个是源,第二个是目标数。但是两个不能同时是存储器位置的数。
移位操作,第一个数是移位量,第二个是移位位数;移位量采用单字节编码,允许0-31位的移位,移位量可以是立即数。
右移操作有无符号和有符号的分别,其他既可以用作无符号运算也可以用作补码运算。
xorl %edx,%edx作用是将寄存器edx设为0,因为x,x^x=0;它等效于movl $0,%edx;两者区别,xorl指令需要两个字节,后者要五个字节。
其他的算术操作
指令 效果 描述
imull S R[%edx]:R[%edx] <- SxR[%edx] 有符号全64位乘法
mull S R[%edx]:R[%edx] <- SxR[%edx] 无符号全64位乘法
cltd R[%edx]:R[%edx] <- SignExtend(R[%edx]) 转为四字节
idivl S R[%edx]:R[%edx] <- R[%edx]:R[%edx] mod S 有符号除法
R[%edx]:R[%edx] <- R[%edx]:R[%edx] ÷ S
divl S R[%edx]:R[%edx] <- R[%edx]:R[%edx] mod S 无符号除法
R[%edx]:R[%edx] <- R[%edx]:R[%edx] ÷ S
imull和mull要求其中的一个参数必须在寄存器%eax,另一个则是源操作数;%edx高32位)、%eax(低32位)
idivl将寄存器edx(高32位)和eax(低32位)中的64位数作被除数,除数是指令的操作数,商存储在eax,余数存储在edx中。
cltd相当于intel的cdq,将%eax符合扩展到%edx。
divl指令通常会把%edx设置为0