8086cpu的標誌暫存器有16位,其中儲存的資訊通常被稱為程式狀態字。
其他暫存器時用來存放資料的,整個暫存器具有乙個含義。
flag暫存器是按位起作用的,它的每一位都有專門的含義,記錄特定的資訊。
8086cpu的flag暫存器的結構
1514
1312
111098
7654
3210
ofdf
iftf
sfzf
afpfcf
1、zf標誌
(flag的第六位) 零標誌位
它記錄相關指令執行後
結果為0,zf=1
結果不為0,zf=0
例:mov ax,1
sub ax,1
指令執行後,結果為0,則zf=1
mov ax,2
mov ax,1
指令執行後,結果為1,則zf=0
注意:在8086cpu的指令集中,有的指令的執行是影響標誌暫存器,如:add、sub 等,它們大多數是運算指令(進行邏輯或算數運算)
有的指令的執行對暫存器沒有影響,如mov,push,pop等,它們大多是傳送指令。
2、pf標誌
(flag第二位) 奇偶標誌位
它記錄指令執行後,結果的所有二進位制位中1的個數
為偶數 pf=1
為奇數 pf=0
例:mov al,1
add al,10
執行後,結果為00001011b,其中有3個1(奇數) 則pf=0。
mov al,1
or al,10
執行後,結果為00000011b,其中有2個1(偶數),則pf=1。
3、sf標誌
(flag第七位) 符號標誌位
結果為負,sf=1
結果為正,sf=0
有符號數與補碼
計算機中通常用補碼來表示有符號數。
例:mov al,10000001b
add al,1
將add指令當無符號數運算,那麼add指令相當於計算-127+1為-126(10000010b)
cpu在執行add等指令時,就已經包含兩種含義,也將得到用同一種資訊來記錄兩種結果。
關鍵在於程式需要哪種結果
將資料當做無符號數來運算,sf值無意義。
將資料當做有符號數來運算,可以通過sf得知結果的正負。
某些指令將影響標誌暫存器中多個標誌位,這些被影響的標記位比較全面地記錄了指令的執行結果,為相關的處理提供了所需的依據。
4、cf標誌
(flag第零位) 進製標誌位
在進行無符號運算的時候,它記錄了運算結果的最高有效位向更高位的進製值,或從更高位的借位值。 (進製或借位 cf=1)
例mov al,98h
add al,al
執行後 (al)=30h,cf=1
5、of標誌
(flag第十一位) 溢位標誌位
在進行有符號運算時,如果結果超過了機器所能表示的範圍稱為溢位。
溢位 of=1
6、adc指令
adc是帶進製加法的指令,它利用了cf位記錄的進製數
格式: adc 操作物件1,操作物件2
功能:操作物件1=操作物件1+操作物件2+cf
例 mov ax,2
mov bx,1
sub bx,ax
adc ax,1
執行後,(ax)=4
cf值的含義由adc指令前的指令決定(借位還是進製)
7、sbb指令
帶借位減法的指令,它利用了cf上記錄的借位值。
格式:sbb 操作物件1,操作物件2
功能:操作物件1=操作物件1-操作物件2-cf
sbb和adc是基於相同思想設計的兩種操作指令,sbb在應用思路上與adc類似。
8、cmp指令
cmp是比較指令,功能類似於減法指令,但是不儲存結果。
cmp指令執行後,將對標誌暫存器產生影響。
其他相關指令通過識別這些別影響的標誌暫存器位得知比較結果。
格式:cmp 操作物件1,操作物件2
例:mov ax,1
cmp ax,ax
比較結果為0
其產生影響:zf=1,pf=1,sf=0,cf=0,of=0
具體情況具體分析。
9、檢測比較結果的條件轉移指令
與cmp配合使用。
根據無符號數的比較結果進行轉移的條件轉移指令,它們檢測zf、cf值。
根據有符號數的比較結果進行轉移的條件轉移指令,它們檢測zf、cf和of值。
一些指令:
指令含義
檢測的相關標誌位
je等於則轉移
zf=1
jne不等於則轉移
zf=0
jb低於則轉移
cf=1
jnb不低於則轉移
cf=0
ja高於則轉移
cf=0,zf=0
jna不高於則轉移
cf=1或zf=1
10、df標誌和串傳送指令
(flag第十位) 方向標誌位
在串處理指令中,控制每次操作後si,di的增減
df=0 每次操作後 si,di遞增
df=1 每次操作後 si,di遞減
格式:movsb
功能:(以位元組為單位傳送)
((es)*16+(di))=((ds)*16+(si))
df=0 (si)=(si)+1
(di)=(di)+1
df=1 (si)=(si)-1
(di)=(di)-1
movsw
功能:(以字為單位傳送)
si,di遞增(減)2.
movsb和movsw一般和rep配合使用,格式如下:
rep movsb
rep作用是根據cx的值,重複執行後面的串位址指令。
8086cpu提供下面兩條指令對df位進行設定
cld指令:將標誌暫存器df位置0
std指令:將標誌暫存器df位置1
assume cs:code
data segment
db 'welcome to masm!'
db 16 dup (0)
data ends
code segment
start : mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cldrep movsb
mov ax,4c00h
int 21h
code ends
end start
11、pushf和popf
pushf:將標誌暫存器的值壓棧
popf:從棧中彈出資料,送入標誌暫存器
組合語言 標誌暫存器(flag)
標誌暫存器 flag 1用來儲存相關指令的某些資料結果 2用來為cpu執行相關的指令提供行為依據 3用來控制cpu的相關工作方式 flag暫存器是按位起作用,每一位都有專門的含義 8086cpu 0 cf 2 ff 4 af 6 zf 7 sf 8 tf 9 if 10 df 11 of 都具有特殊...
常見的標誌暫存器FLAG的標誌位
進製標誌cf主要用來反映運算是否產生進製或借位。如果運算結果的最高位產生了乙個進製或借位,那麼,其值為1,否則其值為0。使用該標誌位的情況有 多字 位元組 數的加減運算,無符號數的大小比較運算,移位操作,字 位元組 之間移位,專門改變cf值的指令等。奇偶標誌pf用於反映運算結果中 1 的個數的奇偶性...
標誌暫存器df 標誌暫存器
cpu內部的暫存器中,有一種特殊的暫存器具有以下三種作用。用來儲存相關指令的某些執行結果 用來為cpu執行相關指令提供行為依據 用來控制cpu的相關工作方式 這種特殊的暫存器在8086cpu種,被稱為標誌暫存器 flag 8086cpu的標誌暫存器有16位,其中儲存的資訊通常被稱為程式狀態字 psw...