《汇编语言》王爽,学习笔记(标志寄存器下)

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在程序结束的时候恢复标志寄存器。

你可能感兴趣的:(《汇编语言》王爽,学习笔记(标志寄存器下))