8086
CPU
的標記寄存器有 16
位,其中存儲的信息通常被稱為程序狀態(tài)字(PSW),標記寄存器和其他寄存器不一樣,其他寄存器是用來存放數(shù)據(jù)的,都是整個寄存器具有一個含義,而標記寄存器是按位起作用的,它的每一位都有專門的含義記錄特定的信息,有些指令的執(zhí)行是影響標記寄存器的,比如 add
sub
mul
div
inc
or
and
等,它們大都是運算指令,在使用一條指令的時候,要注意執(zhí)行結果對標記寄存器的那些標志位造成影響。
標記寄存器的結構如下:
1、CF 進位標記位
標記寄存器的第 0
位是 CF
進位標記位。一般情況下,在進行無符號數(shù)運算的時候,它記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。
2、PF 奇偶標記位
標記寄存器的第 2
位是 PF
奇偶標記位,它記錄相關指令執(zhí)行后,其結果的所有 bit
位中 1
的個數(shù)是否為偶數(shù),如果 1
的個數(shù)為偶數(shù),PF = 1
,如果 1
的個數(shù)為奇數(shù),PF = 0
。
3、ZF 零標記位
標記寄存器的第 6
位是 ZF
零標記位,它記錄相關指令執(zhí)行后,其結果是否為 0
,如果為 0
,ZF = 1
,如果不為 0
,ZF = 0
。
4、SF 符號標記位
標記寄存器的第 7
位是 SF
符號標記位,它記錄相關指令執(zhí)行后,其結果是否為負數(shù),如果為負數(shù),SF = 1
,如果非負,SF = 0
。
5、DF 方向標志位
標記寄存器的 10
位是 DF
,在串處理指令中,控制每次操作后 si
di
的增減。
df = 0 每次操作后 si、di 遞增
df = 1 每次操作后 si、di 遞減
看一下下面的串傳送指令
指令:movsb
功能:執(zhí)行 movsb 指令相當于進行下面幾個步驟
(1)((es) 16 + (di))= ((ds) 16 + (si))
(2)如果 df = 0 則:(si)= (si)+ 1
(di)= (di)+ 1(2)如果 df = 0 則:(si)= (si)- 1
(di)= (di)- 1
由于 df
位決定著串傳送指令執(zhí)行后 si
和 di
改變的方向,所以 CPU
提供下面兩條指令對 df
位進行設置
cld 指令:將標志寄存器的 df 位置 0
stb 指令:將標志寄存器的 df 位置 1
6、OF 溢出標記位
標記寄存器的第 11
位是 OF
溢出標記位,一般情況下,它記錄了有符號數(shù)運算的結果是否發(fā)生了溢出,如果發(fā)生溢出,OF = 1
,如果沒有,OF = 0
。
7、ADC 指令
adc
是帶進位加法指令,它利用了 CF
位上記錄的進位值
指令格式:adc 操作對象1,操作對象2
功能:操作對象1 = 操作對象1 + 操作對象2 + CF
8、SBB 指令
sbb
是帶借位減法指令,它利用了 CF
位上記錄的借位值
指令格式:sbb 操作對象1,操作對象2
功能:操作對象1 = 操作對象1 - 操作對象2 - CF
9、CMP 指令
cmp
是比較指令,cmp
相當于減法指令,只是不保存結果,cmp
指令執(zhí)行后將對標記寄存器產(chǎn)生影響,其他相關指令通過識別這些被影響的標志寄存器位來得知比較結果。
指令格式:cmp 操作對象1,操作對象2
功能:操作對象1 - 操作對象2,但不保存結果,僅僅根據(jù)計算結果對標記寄存器進行設置
10、檢測比較結果的條件轉移指令
常用的根據(jù)無符號的比較結果進行轉移的條件轉移指令
指令 含義 檢測的相關標志位
je 等于則跳轉 zf = 1
jne 不等于則跳轉 zf = 0
jb 低于則跳轉 cf = 1
jnb 不低于則跳轉 cf = 0
ja 高于則跳轉 cf = 0 且 zf = 0
jna 不高于則跳轉 cf = 1 且 zf = 1
這些指令比較常用,他們都比較好記憶,第一個字母都是 j ,表示 jump ,后面的字母表示如下含義
含義
e 表示 equel
ne 表示 not equel
b 表示 below
nb 表示 not below
a 表示 above
na 表示 not above
11、pushf 和 popf 指令
pushf
的功能是將標志寄存器的值壓棧,而 popf
是從棧中彈出數(shù)據(jù),送入標記寄存器中,pushf
和 popf
為直接訪問標志寄存器提供了一直方法。