cmp指令
cmp是比较指令,相当于减法指令,只是不保存结果,cmp执行之后只会对标志寄存器产生影响,cmp指令格式:cmp 操作数1,操作数2。
通过cmp指令可以很轻易的比较出两个数据的大小,举几个例子:
(1)如果两个数据相等,那么他们相减之后必定是0,那么标志位ZF的值就是1。
(2)如果是无符号数,操作数1比操作数2大,那么标志位CF就为0,因为不会产生借位,同理,CF位为1,表示2比1大,需要借位。
(3)如果是有符号数,观察标志位SF与OF即可,SF表示了最后的结果是正是负,而OF表示了这个结果是否是由溢出而得到的,因为SF只记录实际结果的最高位,这不能说明这是在逻辑上所得的正确结果,而OF可以表示这个实际结果是否正确。
inc,dec指令
一开始介绍add,sub指令之时就提到了inc和dec指令,他们分别对应自增和自减操作,那时特提到了,inc和dec与add,sub之间有一点的不同,就是inc与dec不影响标志寄存器的值,所以在一些特定的场合,你需要不干涉标志寄存器,但是要改变地址的话,就只能多用几个inc指令了。
条件跳转指令
由于cmp指令的存在,我们可以比较两个数据的大小,也就出现了条件跳转指令,和C语言中的if语句很类似。
je 等于则转移(ZF = 1)
jne 不等于则转移(ZF = 0)
jb 小于则转移,无符号数(CF = 1)
jnb 不小于则转移,无符号数(CF = 0)
ja 大于则转移,无符号数(CF = 0 && ZF = 0)
jna 小于等于则转移,无符号数(CF = 1 || ZF = 1)
这些一些无符号数常用的条件转移语句。
DF与串传送指令
DF是标志寄存器的第10位,方向标志位,他与串传送指令(movsb,movsw)相关,控制每次操作后的SI,DI的增减。
DF = 0,正向,每次操作后SI,DI递增,DF = 1,反向,每次操作后SI,DI递减。
串传送指令按照一次传送的字节数分为两种,一次传送一个字节,movsb,一次传送一个字,movsw。
串传送指令是将DS:SI指向的内存单元中的内容传入ES:DI中,根据DF来增减SI,DI,用CX来控制次数。
pushf和popf
pushf的功能是将标志寄存器的值入栈,popf是从栈中弹出数据送入标志寄存器中,这两个指令不需要操作数,pushf也是在调用子程序的时候需要做的一步,popf在程序结束的时候恢复标志寄存器。