在8086CPU中,有一种标记寄存器,长度为16bit;
其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag。
功能:1)用来存储相关指令的某些执行结果;
2)用来为CPU执行相关指令提供行为依据;
3)用来控制CPU的相关工作方式。
flag寄存器各位示意图
注明:16位中未标明字符的各位在8086CPU中没有使用,无意义;
标明字符的各位具有特殊含义。
位 符号 英文全称 中文名称 说明(数学或逻辑运算)
0 CF Carry Flag 进位标记位 无符号数运算结果是否进位/借位
2 PF Parity Flag 奇偶标志位 运算结果二进制表示各位为1的个数(奇偶表示)
4 AF Auxiliary carry Flag 辅助进位标记位 AF=1时,向高位或高字节进位或借位
6 ZF Zero Flag 零标志位 运算结果是否为0
7 SF Sign Flag 符号标记位 有符号数运算结果的正负
8 TF Trace Flag 跟踪标记位 TF=1,产生单步中断,引发中断过程
9 IF Interrupt-enable Flag 中断允许标记位 IF=1/0,CPU允许中断或关闭中断
10 DF Direction Flag 方向标记位 字符串处理指令中DF=0/1,控制每次操作si,di的增减
11 OF Overflow Flag 溢出标记位 有符号数运算结果是否溢出
注明:数学或逻辑运算指令才会影响flag,包括add,sub,mul,div,inc,dec,or,and等;
mov,push,pop等传送指令对flag没有影响;
TF跟踪标志(为调试机器或调试程序发现故障而设置):
TF=1,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序;
TF=0,CPU处在连续工作状态。
IF中断允许标记位(可屏蔽中断的中断过程中CPU检测IF确定是否屏蔽中断):
IF=1,CPU执行完当前指令后,响应中断,引发中断过程;
IF=0,CPU执行完当前指令后,不响应中断。
sti,则IF=1;
cti,则IF=0.
各寄存器的详细说明参考:http://www.cnblogs.com/ant-colonies/p/6008322.html
标记寄存器在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
位 标志 值为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 DI(Disabled Interrupt) EI(Inabled Interrupt)
10 DF DN(DowN) UP(Up)
11 OF OV(Overflow) NV(Not Overflow)
标记位CF与OF:
adc是带进位的加法指令
指令格式:adc object1,object2
功能:object1=object1+object2+CF
举例:adc ax,bx即 (ax)=(ax)+(bx)+CF
sbb是带借位的减法指令
指令格式:sbb object1,object2
功能:object1=object1-object2-CF
举例:adc ax,bx即 (ax)=(ax)-(bx)-CF
注:adc和sbb可以用于解决add,sub运算时的进位无法存储的问题;
adc(add & CF),带进位的加法;
sbb(sub & below),带错位的减法;
标志位CF与OF的比较:
1111 1111 8bit表示范围 对应标志位 超出表示范围时
2^8-1(255) 无符号数[0,255] CF 向更高位发生进位或借位
2^7-1(127) 有符号数[-128~127] OF 发生溢出
cmp指令
指令格式:cmp object1,object2
功能:计算操作对象object1-object2,但不保存结果,仅根据计算结果对标志寄存器进行设置
举例:
cmp ax,ax ;(无符号数之间的比较)
执行后ax值不变,zf=1,pf=1,cf=0,of=0 ;
mov ax,8
mov bx,3
cmp ax,bx
执行后:(ax)=8,zf=0,pf=1,cf=0,of=0。
指令 cmp ax,bx (无符号数之间比较,参考的标记位zf,cf)
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,则(ax)<=(bx)
指令 cmp ah,bh (有符号数之间比较,参考的标记位sf,of,zf)
sf=1,且of=0,则(ah)<(bh)
sf=1,且of=1,则(ah)>(bh)
sf=0,且of=1,则(ah)<(bh)
sf=0,且of=0,则(ah)>=(bh)
条件转移指令:
"转移"的本质是——修改IP;"条件"指的是可以根据某种条件,决定是否修改IP
所有条件转移指令的转移位移范围为[-128,127]
1)jcxz,即当(cx)=0时,即修改IP(实现转移)
2)被cmp指令影响标记寄存器标记位,与以下条件转移指令配合使用
常用的根据无符号数的比较结果进行转移的条件转移指令:
指令 含义 检测相关的标志位
je 等于则转移 zf=1
jne 不等于则转移 zf=0
jb 小于则转移 cf=1
jnb 不小于则转移 cf=0
ja 大于则转移 cf=0且zf=0
jna 不大于则转移 cf=1或zf=1
注:j-jmp
e-equal ne-not equal
b-below nb-not below
a-above na-not above
标记位DF与串传送指令:
df(direction flag),方向标志位,控制每次操作后si,di的增减
df=0,si,di递增
df=1,si,di递减
字符串传送指令:
格式:movsb ;mov string byte
功能:1)((es)*16+(di))=((ds)*16+(si))
即:mov es:[di],byte ptr ds:[si]
2)当df=0, (si)=(si)+1
(di)=(di)+1
即:inc si
inc di
当df=1, (si)=(si)-1
(di)=(di)-1
即:dec si
dec di
格式:movsw ;mov string word
功能:1)((es)*16+(di))=((ds)*16+(si))
即:mov es:[di],word ptr ds:[si]
2)当df=0, (si)=(si)+2
(di)=(di)+2
即:add si,2
add di,2
当df=1, (si)=(si)-2
(di)=(di)-2
即:sub si
sub di
一般movsb/movsw与rep配合使用 ;rep-repeat
格式:rep movsb
即:s:movsb
loop s ;所以rep的作用是根据cx的值,进行重复串传送
设置df的指令:
cld ;将df置0,字符串传送——偏移地址递增的方向 clear df
std ;将df置1,字符串传送——偏移地址递减的方向 set df
assume cs:code,ds:data data segment db 'Welcome to masm!' ;将此字符串复制到相同段地址,偏移地址为16的内存位置 db 16 dup (0) data ends code segment start: mov ax,data mov ds,ax mov es,ax mov si,0 mov di,16 mov cx,8 cld rep movsw mov ax,4c00h int 21h code ends end start
pushf和popf:
pushf的功能——将标记寄存器的值压栈;
popf的功能——出栈,将值送入标记寄存器中。
注:此文参考网络和《汇编语言》(王爽,第二版)