汇编语言(王爽)11章标记寄存器和对补码的理解

对补码的理解:
将负数用补码表示,实际上是实现了一种从[-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位计算的结果在-128127以外
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

NVUPEIPLNZNAPONC
OFDFSFZFPFCF
标志值为1的标志值为0的标志
0CFCY(CarrY)NC(Not Carry)
2PFPE(Parity Even)PO(Parity Odd)
4AFAC(Auxiliary Carry)NA(No Auxiliary carry)
6ZFZR(ZeRo)NZ(Not Zero)
7SFNG(NeGative)PL(Positive)
9IFEI(Inabled Interrupt)DI(Disabled Interrupt)
10DFDN(DowN)UP(Up)
11OFOV(Overflow)NV(Not Overflow)

标志寄存器:

8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。简称flag。
flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。

1514131211109876543210
OFDFIFTFSFZFAFPFCF

flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义,而其余位都具有特殊的含义。

CF:进位标志位。在无符号运算时,记录了运算结果的最高有效位向更高位的进位值或从更高位借位,
产生进位或借位时CF=1,否则CF=0;

PF:奇偶标志位。相关指令执行后结果所有bit中1的个数为偶数,那么PF=11的个数为奇数则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=18086能响应外部中断,反之则屏蔽外部中断;
使用cli(Clear Interupt)设置if=0sti(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值