title: 汇编笔记_第十一章
date: 2018-12-30 14:00:51
tags:
标志寄存器的作用:
用来控制CPU的相关工作方式
标志寄存器由16位,按位起作用,0,2,4,6,7,8,9,10,11有特殊的含义,其他的没有任何含义;
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 |
标志位的符号
零标志ZF(Zero flag) | ZR(1) | NZ(0) |
奇偶标志PF(Parity flag) | PE(1) | PO(0) |
符号标志SF(Sign flag) | NG(1) | PL(0) |
进位标志CF(Carry flag) | CY(1) | NC(0) |
溢出标志OF(Over flow flag) | OV(1) | NV(0) |
方向标志DF(Direction flag) | DN(1) | UP(0) |
中断标志IF(Interrupt flag) | EI(1) | DI(0) |
辅助标志AF(Auxiliary carry flag) | AC(1) | NA(0) |
flag的第6位
它记录相关指令执行后,
例如:
mov ax,1
sub ax,1
mov ax,1
and ax,0
指令执行后,结果为0,则ZF=1;
mov ax,2
sub ax,1
mov ax,1
or ax,1
指令执行后,结果为1,则ZF=0;
在8086CPU的指令集中,有的指令的执行事影响标志寄存器的,例如:add,sub,mul,div,inc,or,and等。有的不影响,如:mov push,pop等传送指令;
flag的第二位
它记录指令执行后,结果的所有二进制位中1的个数:
例如:
mov al,1
add al,10
执行后,PF=0;
mov al,1
or al,10
执行后,PF=1;
flag的第七位
它记录指令执行后:
mov al,10000001b
add al,1
执行后SF=1;
flag的第0位
在进行 无符号数运算 的时候,它记录的运算结果的最高有效位项更高位的进位值,或从更高位的借位值;
例:
mov al,98h
add al,al ;(al)=30h,cf=1
add al,al ;(al)=30h,cf=1
flag的第11位
在进行 有符号数运算 的时候,如果结果超出了及其所能表示的范围称为溢出;
溢出时OF=1;
注意:
例如:
mov al,0F0H
add al,78H
CF=1,OF=0;
对于无符号运算,0F0H+78H有进位,CF=1;对于有符号数运算,不发生溢出,OF=0;
例如:
sub al,al
;0h=0000 0000b
;CF=0 OF=0 SF=0 ZF=1 PF=1
mov al,10h
;10h=0001 0000b
;CF=0 OF=0 SF=0 ZF=1 PF=1
add al,90h
;90h=1001 0000b
;ans=1010 0000b
;CF=0 OF=0 SF=1 ZF=0 PF=1
mov al,80h
;80h=1000 0000b
;CF=0 OF=0 SF=1 ZF=0 PF=1
add al,80h
;80h=1000 0000b=128d
;ans=1 0000 0000b=256d
;CF=1 OF=1 SF=0 ZF=1 PF=1
mov al,0FCH
;0FCH=1111 1100b=252d
;CF=1 OF=1 SF=0 ZF=1 PF=1
add al,05h
;05h=0000 0101b
;ans=1 0000 0001b=257d
;CF=1 OF=0 SF=0 ZF=0 PF=0
mov al,7DH
;7DH=0111 1101b=125d
;CF=1 OF=0 SF=0 ZF=0 PF=0
add al,0BH
;0BH=0000 1011b=11d
;ans=1000 1000b=136d
;CF=0 OF=1 SF=1 ZF=0 PF=1
总结:
adc是带进位加法指令,他利用了CF位上记录的进位值;
格式:
adc 操作对象1,操作对象2
功能:
操作对象1=操作对象2+CF
例如:adc ax,bx
==(ax)=(ax)+(bx)+CF
mov ax,2
mov bx,1
sub bx,ax
adc ax,1
(ax)=(ax)+1+CF=4
mov al,98h
add al,al
adc al,3
(ax)=(ax)+3+CF=30H+3+1=34H
编写一个对两个128位进制数据进行相加的子程序:
add128:
push ax
push cx
push si
push di
sub ax,ax ;置CF为零
mov cx,8
s:
mov ax,[si]
adc ax,[si]
mov [si],ax
inc si
inc si
inc di
inc di
;注意这里只能这么写,不能改成add si,2,否则会置CF为零
loop s
pop di
pop si
pop cx
pop ax
sbb是带借位减法指令,利用了CF位上记录的借位值
格式:
sbb 操作对象1,操作对象2
功能:
操作对象1=操作对象1-操作对象2-CF
比如:
sbb ax,bx
实现:(ax)=(ax)-(bx)-CF
sbb指令执行后,将对CF进行设置;
cmp是比较指令,功能相当于减法指令,但 不保存结果;
cmp指令执行后,将对标志寄存器产生影响;
格式:
cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2
不保存结果,仅仅根据计算结果对标志寄存器进行设置;
例如:
cmp ax,ax
ZF=1
PF=1
SF=0
CF=0
OF=0
cmp ax,bx
指令执行后,可以根据相关的标志位的值看出比较的结果:
如果(ax)=(bx) | (ax)-(bx)=0 | ZF=1 |
如果(ax) \(\neq\) (bx) | (ax)-(bx) \(\neq\) 0 | ZF=0 |
如果(ax) \(\lt\) (bx) | (ax)-(bx)将产生借位 | CF=1 |
如果(ax) \(\ge\) (bx) | (ax)-(bx)不必借位 | CF=0 |
如果(ax) \(\gt\) (bx) | (ax)-(bx)既不必借位,结果又不为零 | CF=0并且ZF=0 |
如果(ax) \(\le\) (bx) | (ax)-(bx)既可能借位,结果可能为零 | CF=1或ZF=1 |
cmp与add、sub一样既可以对无符号数比较也可以对有符号数比较;
不能单纯的看SF的值来判断两个操作对象的大小,因为溢出的问题;
cmp ah,bh
所有条件转移指令的转移位移是[-128,127];
通常和cmp相配合;
cmp指令的比较结果进行转移的指令分为:
根据无符号数的比较结果进行转移的条件转移指令:
指令 | 含义 | 检测的相关标志位 |
---|---|---|
je | 等于则转移 | ZF=1 |
jne | 不等于则转移 | ZF=0 |
jb | 低于则转移 | CF=1 |
jnb | 不低于则转移 | CF=0 |
ja | 高于则转移 | CF=0,ZF=0 |
jan | 不高于则转移 | CF=1或ZF=1 |
https://www.cnblogs.com/31415926535x/p/10200283.html
(end)
原文:https://www.cnblogs.com/31415926535x/p/10200283.html