标志寄存器和跳转指令
cmp、test、add等指令可以改变标志寄存器的标志位,然后根据标志位完成跳转指令来实现循环、判断。
一、标志寄存器
1、ZF:零(Zero Flag),判断结果是否为0。运算结果0,ZF置1,否则置0。
2、PF:奇偶(Parity Flag),反映运算结果低8位中'1'的个数。'1'的个数为偶数,PF置1,否则置0。
3、SF:符号(Sign Flag),反映运算结果的符号。运算结果为负,SF置1,否则置0。
4、CF:进位(Carry Flag),反映无符号运算是否产生进位或借位。运算结果的最高有效位向更高位进位或者借位,CF置1,否则置0。
5、OF:溢出(Overflow Flag),反映有符号运算是否溢出。运算结果超过了8位或者16位有符号数的表示范围,OF置1,否则置0。
6、AF:辅助(Auxiliary Flag),在字节操作时低半字节向高半字节进位或借位。字操作时低字节向高字节进位或借位,AF置1,否则置0。
7、DF:方向(Direction Flag),决定串处理指令控制每次操作后si、di的增减。df=0,则每次操作后si、di递增,否则递减。
8、IF:中断(Interrupt Flag),决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。
9、TF:陷阱(Trap Flag),TF被设置位1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令。
二、test和cmp指令
test和cmp都用在两个操作数的比较上,都不会改变目标操作数。区别主要是:test进行的是逻辑与运算,运算结果为0时,ZF=1;cmp进行的是算数减法运算,运算结果为0时,ZF=1。
test常用在测试寄存器是否为0,寄存器某位或某几位是为0或1。
test eax, eax jz short loc_401035 ;如果eax=0,则ZF=1,此时就会跳转。 ;;;;;;;;;;;;; test ax, 0100000000000001b jnz short loc_401035 ;如果ax的第2和第16位同时为1,则ZF=0,此时跳转。用来检测寄存器的某位是否为1或0。
影响标志位的指令
修改标志位
影响标志位的指令
test指令
cmp指令
常用跳转指令
jz和jnz
jz和jnz
jz和jnz
jz和jnz
jz和jnz