对补码的理解:
将负数用补码表示,实际上是实现了一种从[-128, 127]到[0, 255]的映射。
无符号数au对应有符号数as,那么au的原码就是as的补码。比如
无符号数33原码00100001,映射到有符号数也是+33,所以+33的补码是00100001。
无符号数133原码10000101,映射到有符号数是133-256=-123,所以-123的补码是10000101。
无符号数128原码10000000,映射到有符号数是128-256=-128,所以-128的补码是10000000。
cf:无符号数计算是否进位或借位
of:有符号数计算是否溢出,如8位计算的结果在-128到127以外
sf:有符号数计算的结果是否为负数
zf:结果是否=0
pf:结果是否有偶数个1
关于cf、of和sf的无/有符号数计算,不是取决于这次计算的数是否有符号,
而是指cf把它当无符号数计算,把是否进位或借位的结果保存在cf,
而of和sf把它当有符号数计算,各自保存对应的结果。
标记寄存器在Debug中的表示
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=**** ES=**** SS=**** CS=**** IP=0100 NV UP EI PL NZ NA PO NC
NV | UP | EI | PL | NZ | NA | PO | NC |
---|---|---|---|---|---|---|---|
OF | DF | SF | ZF | PF | CF |
位 | 标志 | 值为1的标志 | 值为0的标志 |
---|---|---|---|
0 | CF | CY(CarrY) | NC(Not Carry) |
2 | PF | PE(Parity Even) | PO(Parity Odd) |
4 | AF | AC(Auxiliary Carry) | NA(No Auxiliary carry) |
6 | ZF | ZR(ZeRo) | NZ(Not Zero) |
7 | SF | NG(NeGative) | PL(Positive) |
9 | IF | EI(Inabled Interrupt) | DI(Disabled Interrupt) |
10 | DF | DN(DowN) | UP(Up) |
11 | OF | OV(Overflow) | NV(Not Overflow) |
标志寄存器:
8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。简称flag。
flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义,而其余位都具有特殊的含义。
CF:进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,
产生进位或借位时CF=1,否则CF=0;
PF:奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=1,1的个数为奇数则PF=0;
AF:辅助进位标志位。运算过程中看最后四位,不论长度为多少。
最后四位向前有进位或者借位,AF=1,否则AF=0;
ZF:零标志位。相关指令执行后结果为0那么ZF=1,结果不为0则ZF=0;
SF:符号标志位。相关指令执行后结果为负那么SF=1,结果非负数则SF=0;
TF:调试标志位。当TF=1时,处理器每次只执行一条指令,即单步执行;
IF:中断允许标志位。它用来控制8086是否允许接收外部中断请求。
若IF=1,8086能响应外部中断,反之则屏蔽外部中断;
使用cli(Clear Interupt)设置if=0,sti(Set Interupt)设置if=1
DF:方向标志位。在串处理指令中,每次操作后,如果DF=0,si、di递增,如果DF=1,si、di递减;
注意此处DF的值是由程序员进行设定的 cld命令是将DF设置为0,std命令是将DF设置为1;
OF:溢出标志位。记录了有符号运算的结果是否发生了溢出,如果发生溢出OF=1,如果没有OF=0;
pushf
pop ax
and ah,11111100b ;//if和在tf第8/9位,这样可以修改tf=0和if=0
push ax
pop f