大家好,又见面了,我是你们的朋友全栈君。
标志位简介:
标志寄存器,又称程序状态寄存器(它的内容是Program Status Word,PSW).这是一个存放条件码标志,控制标志和系统标志的寄存器.
6个状态标志位
CF—进位标志,加法时的最高位(D7或D15)产生进位或减法时最高位出现借位,则CF=1,否则CF=0;
AF—辅助进位标志,供BCD码使用。当D3位出现进位或借位时AF=1,否则AF=0;
OF—溢出标志,带符号数进行算术运算时,其结果超出了8位或16位的表示范围,产生溢出,则OF=1,否则OF=0;
ZF—零标志,运算结果各位都为零,则ZF=1,否则ZF=0;
SF—符号标志,运算结果为负数时,即运算结果的最高位为1,则SF=1,否则SF=0;
PF—奇偶标志,反映操作结果中“1”的个数的情况,若有偶数个“1”,则PF=1,否则PF=0。
3个控制标志位
DF—方向标志,用来控制数据串操作指令的步进方向; 当设置DF=1时,将以递减顺序对数据串中的数据进行处理。当设置DF=0时,递增。
IF—中断允许标志,当设置IF=1,开中断,CPU可响应可屏蔽中断请求;当设置IF=0时,关中断,CPU不响应可屏蔽中断请求。
TF—陷阱标志,为程序调试而设的。当设置TF=1,CPU处于单步执行指令的方式;当设置TF=0时,CPU正常执行程序。
详解:
1、进位标志CF (Carry Flag) 当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,
即CF = 1;否则CF= 0。
49H 6DH=B6H, 没有进位:CF = 0
BBH 6AH=(1)25H,有进位:CF = 1
2、零标志ZF (Zero Flag) 若运算结果为0,则ZF = 1;否则ZF = 0
49H 6DH=B6H,结果不是零:ZF = 0
75H 8BH=(1)00H,结果是零:ZF = 1
3、符号标志SF (Sign Flag) 运算结果最高位为1,则SF = 1;否则SF = 0
49H 6DH=B6H=10110110B,SF=1
4、奇偶标志PF(Parity Flag) 当运算结果最低字节中“1”的个数为零或偶数时,PF = 1;否则PF = 0
3AH 7CH=B6H=10110110B结果中有5个1,是奇数:PF = 0
5、溢出标志OF (Overflow Flag) 若算术运算的结果有溢出,则OF=1;否则 OF=0
49H 6DH =B6H,产生溢出:OF = 1
75H 8BH =(1)26H,没有溢出:OF = 0
什么是溢出?
处理器内部以补码表示有符号数8位表达的整数范围是:+127~-128
16位表达的范围是:+32767~-32768
如果运算结果超出这个范围,就产生了溢出有溢出,说明有符号数的运算结果不正确49H+6DH=B6H,就是73+109=182,已经超出-128~+127范围,产生溢出,故OF=1;
另一方面,补码B6H表达真值是-74,显然运算结果也不正确
溢出标志OF和进位标志CF是两个意义不同的标志
进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;
溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
例1:49H 6DH=B6H无符号数运算:
73+109=182范围内,
无进位有符号数运算:73+109=182范围外,有溢出
例2:BBH 6AH=(1)25H无符号数运算:
187+106=293范围外,
有进位有符号数运算:-69+106=37范围内,无溢出
溢出的判断判断运算结果是否溢出有一个简单的规则:
只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确其他情况下,则不会产生溢出
1.当两个符号相同的数相加,结果的符号与之相反,则OF=1,否则OF=0.
2.当两个符号不同的数相减,结果的符号与减数相同,则OF=1,否则OF=0.
6、辅助进位标志AF(Auxiliary Flag) 运算时D3位(低半字节)有进位或借位时,AF = 1;否则AF = 0。
49H 6DH=B6H,D3有进位:AF = 1 100 1001B 110 1101B=1011 0110B
7、方向标志DF(Direction Flag) 用于串操作指令中,控制地址的变化方向:设置DF=0,存储器地址自动增加;
设置DF=1,存储器地址自动减少。
CLD指令复位方向标志:DF=0
STD指令置位方向标志:DF=1
8、中断允许标志IF(Interrupt Flag) 用于控制外部可屏蔽中断是否可以被处理器响应:
设置IF=1,则允许中断;
设置IF=0,则禁止中断。
CLI指令复位中断标志:IF=0
STI指令置位中断标志:IF=1
9、陷阱标志TF(Trap Flag) 用于控制处理器进入单步操作方式:
设置TF=0,处理器正常工作;
设置TF=1,处理器单步执行指令。
单步执行指令——处理器在每条指令执行结束时,便产生一个编号为1的内部中断这种内部中断称为单步中断所以TF也称为单步标志利用单步中断可对程序进行逐条指令的调试这种逐条指令调试程序的方法就是单步调试 EU控制器是执行指令的控制电路,实现从队列中取指令、译码、产生控制信号等。,
在(cmd debug)调试程序中为了使标志位的值显尔易见,他提供用符号表示标志位的值。
标志 | 值为1 | 值为0 |
---|---|---|
OF | OV | NV |
DF | DN | UP |
IF | EI | DI |
SF | NG | PL |
ZF | ZR | NZ |
AF | AC | NA |
PF | PE | PO |
CF | CY | NC |
cmp指令 cmp ax,bx 如果(ax)=(bx), 则 zf=1 如果(ax)!=(bx), 则 zf=0 如果(ax)<(bx), 则 cf=1 如果(ax)>=(bx),则 cf=0 如果(ax)>(bx), 则 cf=0且zf=0 如果(ax)<=(bx),则 cf=1或zf=1 cmp指令配合和条件转移指令配合使用 条件转移指令
指令 | 含义 | 检测的相关标志位 |
---|---|---|
je | 等于则转移 | zf=1 |
jne | 不等于则转移 | zf=0 |
jb | 小于则转移 | cf=1 |
jnb | 不小于则转移 | cf=0 |
ja | 大于则转移 | cf=0且zf=0 |
jna | 不大于则转移 | cf=1且zf=1 |
DF标志和串传送指令 DF 方向标志位,在串处理指令中,控制每次操作后si、di的增减 df=0 每次操作后si、di递增 df=1 每次操作后si、di递减 movsb: 相当于 mov es:[di],byte ptr ds:[si] 如果 df=0 inc di inc si 如果 df=1 dec di dec si movsw: 相当于 mov es:[di],word ptr ds:[si] 如果 df=0 add si,2 add di,2 如果 df=1 sub si,2 sub di,2 一般来说,movsb和movsw都和rep配合使用,格式如下: rep movsb 或者 rep movsw 相当于 s:movsb loop s rep的作用是根据cx的值,重复执行rep后面的串传送指令
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157820.html原文链接:https://javaforall.cn