第十一章.md

第十一章 标志寄存器

引言

8086CPU标志寄存器有16bits,其中的存储信息叫程序状态字(psw)

标志寄存器按位表示意义

1567651426982其中空的位无意义,保留


ZF标志位

zero flag 结果 == 0? zf=1 : zf=0

1567651723845

使用指令应注意是否影响标志寄存器


PF标志位

parity flag结果二进制1的个数为偶数? pf=1 : pf=0;


SF标志位

symbol flag结果为负数? sf=1: sf=0;

SF标志位总是将运算看做有符号数进行操作,当计算数值需要看做有符号时,才看sf标志位


CF标志位(无符号溢出)

1567652717447

1567653022287

1567653041274

1567653168171


OF标志位(有符号溢出)

add 98, 99 == -59

1567653695400

1567653747834


adc指令

带进位加法指令 adc 对象1, 对象2

对象1 = 对象1 + 对象2 + CF

adc ax, bx 即`ax = ax + bx + CF

示例

mov ax, 2
mov bx, 1
sub bx, ax			; 进行了借位, CF = 1
adc ax, 1			; 结果 ax = ax + 1 + CF , ax = 4

add ax, bx 等同于

add al, bl		;CF保存是否进位
adc ah, bh		;adc将进位状态加上

1567655178350

inc si
inc si		;不能直接 add si, 2 因为会影响cf的值 

sbb指令

带借位减法指令,使用CF位上的值 sbb 对象1, 对象2

对象1 = 对象1 - 对象2 - cf

adc指令


cmp指令

cmp a, b

a -b

该指令仅仅影响标志位值,不会保存结果

1567745907405

有符号数

1567746163470

1567746206215

  1. SF = 1, OF = 0

    此时,没有溢出,sf标志位与实际运算结果一致

  2. SF = 1, OF = 1

    此时,溢出,sf标志位与实际结果相反

1567746629666

1567746651267

1567746703382

1567747943034

ZF=1时,je就会跳转


DF标志和串传送指令

1567989985698

*movsb*
功能: 以字节为单位进行传送
es*16 + di = ds*16 + si
1.如果DF==0, si++,di++
2.如果DF==1, si--, di--

*movsbw*
功能: 以字为单位进行传送(同上)

*rep*
功能:根据cx的值,重复执行后面的串传送指令
格式:rep movsw  (可以实现cx个字的传送)

cld:将df设置为0

std:将df设置为1


pushf, popf

pushf:将标志寄存器的值送入栈

popf:将栈中的值弹出到标志寄存器

原文地址:https://www.cnblogs.com/nsfoxer/p/14353806.html