Linux常用汇编指令

一、 数据传输指令

1. 通用数据传输指令

mov		传送字或字节
(
movb		传送字节
movw		传送字
movl		传送双字
movq		传送四字
movabsq		传送绝对的四字
)
movsx		先符号扩展,再传送
movzx		先零扩展,再传送
cltq		x86-64把%eax符号扩展到%rax
push		把字压入堆栈
pop			把字弹出堆栈

PUSHA   	把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.  
POPA    	把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.  
PUSHAD  	把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.  
POPAD   	把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.  
BSWAP   	交换32位寄存器里字节的顺序  
XCHG    	交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)  
CMPXCHG 	比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)  
XADD    	先交换再累加.(结果在第一个操作数里)  
XLAT    	字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL) 

2. 算数和逻辑操作

lea			加载有效地址
inc			加1
dec			减1
neg			取负
not			取补
add			加
sub			减
imul		有符号乘法
mul			无符号乘法
div			无符号除法
idiv		有符号除法
xor			异或
or			或
and			与
sal			算数左移
shl			逻辑左移
sar			算数右移(填上符号位)
shr			逻辑位移
cbw			字节转化为字(al中的字节的符号扩展到ah)
vwd			字节转化为双字(ax中的字的符号扩展到dx)
cwde		字节转化为双字(ax中的字符号扩展到eax)

3. 控制

3.1 条件码

最常用条件码:

CF:进位标志。最近的操作使最高位产生了进位。

ZF:零标志。最近的操作得出的结果为0

SF:符号标志。最近的操作得到的结果为负数

OF:溢出标志。最近的操作导致一个补码溢出----正/负溢出

假如有t = a + b

CF:(unsigned) t < (unsigned) a

ZF:(t == 0)

SF:(t < 0)

OF:(a < 0 == b < 0) && (t < 0 != a < 0)这个意思就是a,b同号的时候且t和a不同号,则就表明发生了溢出

cmp			比较(基于 S2 - S1,即和sub功能一致,只不过不会更新寄存器只会保存条件码)
(
cmpb		比较字节
cmpw		比较字
cmpl		比较双字
cmpq		比较四字
)
test		测试(基于 S1 & S2,其行为基本和add一致,也是不改变寄存器只改变条件码)	
3.2 访问条件码
指令同义名效果设置条件
SETE DSETZD<–ZF相等/零
SETNE DSETNZD<–~ZF不等/非零
SETS DD<–SF负数
SETNS DD<–~SF非负数
SETGSETNLE大于(有符号>)
SETGESETNL大于等于(有符号)
SETLSETNGE小于(有符号)
SETLESETNG小于等于(有符号)
SETASETNBE大于(无符号)
SETAESETNB大于等于(无符号)
SETBSETNAE小于(无符号)
SETBESETNA小于等于(无符号)

SET指令是直接将运算后的结果放入D中美和跳转指令不同,跳转指令不需要进行赋值,只需要在满足条件的情况下地址跳转即可

3.3 跳转指令
指令同义名跳转指令描述
JMP Label1直接跳转
JMP *Operand1间接跳转
JE LabelJZZF相等
JNE LabelJNZ~ZF不相等
JS LabelSF负数
JNS Label~SF非负数
JGJNL大于(有符号>)
JGEJNLE大于等于(有符号)
JLJNG小于(有符号)
JLEJNGE小于等于(有符号)
JAJNB大于(无符号)
JAEJNBE大于等于(无符号)
JBJNA小于(无符号)
JBEJNAE小于等于(无符号)
Q: 指令REP和REPZ有什么用?

指令组合rep;ret在反汇编中对应于repz;retq,分别对应同义名。在直到建议书中它们建议rep后面跟着ret的组合来避免使ret指令成为条件跳转指令的目标。根据AMD的说法,当ret指令通过跳转指令到达时,处理器不能正确预测ret指令的目的。这里的rep指令就是一种空操作,因此作为跳转目的插入它,除了能使代码在AMD上运行的更快,同时不会改变代码的其他行为。

3.4 条件传送指令

当传送条件满足时,指令把源值S复制到目的R。处理器只是读源值(可能是从内存中),检查条件码,然后要么更新目的寄存器,要么保持不变。

comve	S,R			相等
cmovne	S,R			不相等/非零
cmovs	S,R			负数
cmovns	S,R			非负数
cmovg	S,R			大于(有符号)
cmovge	S,R			大于等于(有符号)
cmovl	S,R			小于(有符号)
cmovle	S,R			小于等于(有符号)
cmova	S,R			大于(无符号)
cmovae	S,R			大于等于(无符号)
cmovb	S,R			小于(无符号)
cmovbe	S,R			小于等于(无符号)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

call me Patrick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值