汇编总结 标志位/指令

转载http://www.figoyao.com/blog/2009/12/09/182

 

一、标志位操作指令

1、进位CF标志操作指令
清零标志位CLC:CF<-0
置位标志位STC:CF<-1
标志位取反CMC:CF<-NOT CF
2、方向位DF操作指令
清零方向位CLD:DF<-0
置位方向位STD:DF<-1
3、中断允许位IF操作指令
清零CLI:IF<-0
置位STI:IF<-1
4、取标志位操作指令
LAHF:AH<-EFlags低8位
SAHF:EFlags低八位<-AH
5、标志位堆栈操作指令
PUSHF/PUSHFD:16bit/32bit标志位进栈
POPF/POPFD:16bit/32bit标志位出栈

二、算术运算指令
1、加法指令
1)、普通加法指令ADD
ADD  reg/mem,reg/mem/imm
受影响标志位:AF/CF/OF/PF/SF/ZF
2)、带进位的加法ADC
ADC  reg/mem,reg/mem/imm
受影响标志位:AF/CF/OF/PF/SF/ZF
该指令和1)中唯一不同的是除了执行1)中加法外还要加上CF。
3)、加1指令INC
INC  reg/mem
受影响标志位:AF/OF/PF/SF/ZF
4)、交换加法指令XADD
XADD  reg/mem,reg
该指令首先交换两个操作数的值,然再做加法,相当于以下两条指令:
XCHG  reg/mem,reg
ADD  reg.mem,reg
2、减法指令 [和加法指令相反]
1)、普通减法SUB
2)、带借位的减法SBB
除了1)中减法还有减去CF
3)、减1指令DEC
4)、求补指令NEG
NEG  reg/mem
受影响标志位:AF/CF/OF/PF/SF/ZF
执行结果:操作数=0-操作数
3、乘法指令
分为带符号乘法和无符号乘法,区别在于:数据的最高位是作为符号 还是数值 参与运算。
1)、无符号乘法MUL
MUL  reg/mem
受影响标志位:CF/OF
我们知道乘法要有乘数和被乘数,指令中只有一个操作数,所以我们必须知道第二个操作数在哪里。Intel处理的方式是,被乘数提前存在EAX中,然后与给出的乘数相乘,结果放在规定的寄存器中:

乘数位数 隐含的被乘数 乘积存放位置[高-低] 举例
8ALAXMUL  CL
16AXDX-AXNUL  CX
32EAXEDX-EAXMUL  ECX

2)、有符号乘法IMUL
IMUL  reg/mem
受影响标志位:CF/OF
其操作数都作为有符号数相乘。
4、除法指令
1)无符号除法
DIV  reg/mem
不影响标志位
被除数默认存放规则如下:

除数位数隐含的被除数余数
8AXALAH
16DX-AXAXDX
32EDX-EAXEAXEDX

2)有符号除法
IDIV  reg/mem
受影响标志位:AF/CF/OF/PF/SF/ZF

三、逻辑运算指令
1、逻辑与AND指令
AND  reg/mem,reg/mem/imm
受影响的标志位:CF(0)/OF(0)/SF/PF/ZF
执行过程:源操作数和目的操作数进行逻辑与运算,结果存放在目的操作数。
2、逻辑或OR指令
OR  reg/mem,reg/mem/imm
受影响的标志位:CF(0)/OF(0)/SF/PF/ZF
执行过程:源操作数和目的操作数进行逻辑或运算,结果存放在目的操作数。
3、逻辑非NOT指令
NOT  reg/mem
受影响的标志位:无
执行过程:把操作数按位取反。
4、逻辑异与XOR指令
XOR  reg/mem,reg/mem/imm
受影响的标志位:CF(0)/OF(0)/SF/PF/ZF
执行过程:源操作数和目的操作数进行逻辑异与运算,结果存放在目的操作数。
异或就是两数相同则结果为0,反之为1。
5、测试指令TEST
TEST  reg/mem,reg/mem/imm
受影响的标志位:SF/PF/ZF
test类似and指令,但只是逻辑与进行测试,根据结果修改标志位,却不改变操作数的值。

四、跳转指令
1、无条件跳转指令
JUMP  reg/mem/imm
执行结果是跳转到指定地址,然后继续执行代码。按照Intel指令手册 上的说法,jump一共有4中不同的跳法,这比起跳大神的神棍的跳法可少多了:
1)、Near Jump
这种跳法为啥叫near呢,因为它跳来跳去都是在一个代码段跳,所以又称作段内转移。这就好比你遛狗,总是不出你的县城,这就叫near遛 :)
2)、Short Jump
Short Jump是Near Jump的一种,但是比Near还有Near,它跳转的范围是[-128,127]。这时候你可能只是在你的村子溜溜狗而已,太Short了。
3)、Far Jump
一看Far就是那么有气势,此时跳转的范围已经扩大到其他段,你连其他段都能跳,本段当然更可以了,但是要注意,此时你可以跳转到的目标代码的特权级别必 须和当前代码相同:如果你是用户权限,你跳转到系统权限的代码就会出错。这时候你已经厌倦在小县城遛狗了,终于,你鼓起勇气,决定去丈母娘的县城遛狗 ╮(╯_╰)╭。
4)、Task Switch
这个跳转一下就从你当前任务的代码到别的任务里面执行代码了,可以说是跳的最远的。
2、条件跳转指令
顾名思义,得依据条件来跳转,在这里,条件指的是标志寄存器的一个或多个标志位,如果满足条件就跳转否则继续执行跳转指令下面的代码。在介绍指令的时候,首先说下助记符中字母的含义:
E :Equal[相等]
A :Above[大于]
B :Below[小于]
G :Greater Than[大于]
L :Less Than[小于]
N :Not[不]
条件跳转大体上分为2类:
直接标志位测试

助记符 测试条件 跳转条件
JCCF=1有进位
JNCCF=0无进位
JZ/JEZF=1为0或相等
JNZ/JNEZF=0不为0或不等
JSSF=1负数
JNSSF=0正数
JOOF=1溢出
JNOOF=0无溢出
JP/JPEPF=1偶数
JNP/JPOPF=0奇数

间接标志位测试

类别 助记符 测试条件 跳转条件
无符号数
JA/JNBE
JAE/JNB
JB/JNAE
JBE/JNA
CF=0且ZF=0
CF=0
CF=1
CF=1或ZF=1
大于/大于等于
大于等于
小于/小于等于
小于等于
有符号数
JG/JNLE
JGE/JNL
JL/JNGE
JLE/JNG
ZF=0且SF=OF
SF=OF
SF!=OF
SF!=OF或ZF=1
大于/大于等于
大于等于
小于/小于等于
小于等于

以上是根据Intel指令手册3-542 vol.2A )整理,有些教材的跳转条件是错误的。

五、其他指令
本教程不可能把所有指令都介绍完整,有些指令需要在实践的过程中自己查阅手册,学习一门技能从来都不是一蹴而就的。
1、nop指令
nop是空指令,就是占位,除此没有任何作用。
2、call指令
call  reg/mem/imm
call指令执行的过程是,首先把当前EIP或CS加EIP压入堆栈,然后跳转到call后操作数指定地址执行代码。手册里介绍了四种跳转,这里只讲下 Near Call和Far Call。前者call呼叫的函数在同一代码段,此时只需把EIP压栈即可;而后者call呼叫的是不同段,需要把当前段的选择子和EIP均压入栈。
3、ret/retn/retf
ret  reg/mem/imm[可选]
retn是近返回;retf是远返回。

至此汇编语言的基本内容就介绍完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值