flag寄存器:
ZF=1表示计算结果为0,反之
PF = 0表示计算结果二进制表示中1的个数为奇数,反之
SF = 0表示计算结果为正,反之
CF为1,在加法中表明结果出现仅为,在减法中表明结果出现借位,反之
OF = 1表示计算结果溢出,反之
对于无符号数,CPU用CF位记录计算结果是否产生进位
对于有符号数,CPU用OF位记录计算结果是否产生溢出
两者计算结果都用SF位记录符号
adc指令:带进位加法指令
例如:
sbb指令:带借位指令
sbb ah 0:(ah) = (ah) - 0 - (cf)
cmp ax, bx指令
实际上执行了(ax)-(bx),但是结果并不保存在ax中,仅仅改变标志寄存器中相应的位
若 ax=bx 那么ZF = 1;反之
但是对于cmp ax, bx后发现SF = 1,即结果符号为负,能否说明(ax) < (bx)?
否,例如对于有符号数,ah = 22H(补码表示34),bh = 0A0H(补码表示-96)
(ah) - (bh) = 34 - (-96) = 130 = 82H,82H是-126的补码,所以SF = 1,但是ah明显大于bh
要考虑OF和SF得两者大小:
1.对于无符号数cmp,要检查ZF,CF位
2.对于有符号数cmp,要检查SF,OF,ZF位
对于标识寄存器中位的jmp指令,该指令可以配合cmp(无符号数)使用,cmp比较之前两对象大小会修改flag寄存器中对应位,之后使用对应的jmp指令实现跳转
je(e:equal,表明上面cmp两对象相等):ZF = 1转移,反之
jne(ne:not equal,表明上面cmp两对象不相等,下同):ZF = 0转移,反之
jb:CF = 1转移,反之
jnb:CF = 0转移,反之
ja:CF = 1,ZF = 0转移,反之
jna:CF = 1或ZF = 1转移,反之
DF标志位
DF = 0 si和di寄存器内容会递增1
DF = 1 si和di寄存器内容会递减1
例如:
movsb指令:以字节单位传递数据
实现:((es)*16+(di)) = ((ds)*16+(si))
之后如果DF = 0,di和si内容加1(1个内存单元);反之
movsw指令:以字单位传递数据
实现:((es)*16+(di)) = ((ds)*16+(si))
之后如果DF = 0,di和si内容加2(2个内存单元);反之
rep movsb指令:
根据cx寄存器中字数,反复执行“movsb” (cx)次,实现(cx)个字节传递
cld指令:将DF置为0(clear)
std指令:将DF置为1(set)
pushf指令:将标志寄存器内容压栈
popf指令:将栈顶内容弹出到标识寄存器
中断处理程序一直存在内存中,以防止CP随时调用
iret指令:将返回到中断前进程执行(将CS:IP出栈,flag出栈)
mov ax, 8 - 4 = mov ax, 4
设置TF = 1将产生单步中断,CPU将当前进程执行一条指令,之后去执行单步中断的中断处理程序(例如debug)
Done!!!