標誌暫存器通常具有以下三種作用:
1,用來儲存相關指令的某些執行效果
2,用來為cpu執行相關指令提供行為依據
3,用來控制cpu的相關工作方式
8086cpu的flag暫存器結構如下圖所示:
1514
1312
111098
7654
3210
ofdf
iftf
sfzf
afpf
cf在8086的指令集中,運算指令的執行如:add、sub、mul、div、inc、or、and等都會影響標誌暫存器;而傳送指令的執行如:mov、push、pop都不會影響標誌暫存器。
1,zf標誌
flag的第6位是zf,零標誌位。它記錄了相關指令執行後,其結果是否為0,如果為0,那麼zf=1,否則,zf=0。比如當:sub ax,ax執行後,結果為0,就會置zf為1。
2,pf標誌
flag的第2位是pf,奇偶標誌位。它記錄了相關指令執行後,其結果的所有bit位中1的個數是否為偶數。如果1的個數為偶數,pf=1,否則pf=0。如:sub ax,ax執行後,結果一共有0個1,0為偶數,因此會置zf為1。
3,sf標誌
flag的第7位是sf,符號標誌位。它記錄了相關指令執行後,其結果是否為負,如果為負,那麼sf=1,否則,zf=0。它會將運算元看作為有符號數(補碼表示)的運算來記錄結果的正負。如:mov al,10000001badd al,1執行後,結果為10000010b,sf為1。而:mov al,10000001badd al,01111111b執行後,-127+127=0,結果為0,它並不是乙個負數,故sf為0。
4,cf標誌位
flag的第0位是cf,進製標誌位。一般情況下,在進行無符號數運算時,它記錄了運算結果的最高有效位向更高位的進製值,或從更高位的借位值。
如:mov al,98h add al,al add al,al中第二條指令執行結果為98h+98h=130h,所以(al)=30h,cf=1,cf記錄了從最高有效位向更高位的進製值。第三條指令執行結果為30h+30h=60h,所以(al)=60h,cf=0。
而當兩個資料做減法時,有可能向更高位借位。
如:兩個8位資料97h和98h做減法時,將產生借位,借位(置cf為1)後,97h-98h等價於197h-98h。
5,of標誌位
flag的第11位是of,溢位標誌位。一般情況下,of記錄了有符號數運算的結果是否發生了溢位,如果發生了溢位,of=1,否則of=0。
在進行有符號數運算的時候,如果結果超過了機器所能表示的範圍稱為溢位。8位有符號數補碼的表示範圍位-128-127。
對於mov al,98 add al,99執行後,無符號數的結果為197,所以它不產生進製;但作為有符號數的運算,結果為197,它不在8位有符號數的表示範圍內,故產生了溢位,其實它是-59的補碼。所以of=1,cf=0。
對於mov al,0f0h add al,88h執行後,無符號數的結果為178h(376d),它大於255d,所以它產生進製;但作為有符號數的運算,結果為-136,它不在8位有符號數的表示範圍內,(且78h為正數,兩個負數相加的結果得到了乙個正數)故產生了溢位。所以of=1,cf=1。
下面指令執行後,zf、pf、sf、cf、of標誌位的值的變化情況。
sub al,al
zf=1
pf=1
sf=0
cf=0
of=0
結果為0,0個1,未進製,正數,未溢位
mov al,10h
zf=1
pf=1
sf=0
cf=0
of=0
-add al,90h
zf=0
pf=1
sf=1
cf=0
of=0
結果非0,有2個1,未進製,有符號數結果為負,未溢位
mov al,80h
zf=0
pf=1
sf=1
cf=0
of=0
-add al,80h
zf=1
pf=1
sf=0
cf=1
of=1
結果為0,0個1,正數,產生進製,兩負數相加結果為0,(十進位制結果-256<-128)溢位
mov al,ofch
zf=1
pf=1
sf=0
cf=1
of=1
-add al,05h
zf=0
pf=0
sf=0
cf=1
of=0
結果非0,1個1,正數,產生進製,正數加負數不可能溢位,結果為01h,未溢位
mov al,7dh
zf=0
pf=0
sf=0
cf=1
of=0
-add al,0bh
zf=0
pf=1
sf=1
cf=0
of=1
結果非0,2個1,負數,未產生進製,負數加負數結果為正,(十進位制結果136大於127)溢位
比較指令 cmp
比較指令cmp,它的功能相當於減法指令,只是不儲存結果。cmp指令的執行結果將對標誌暫存器產生影響。其他相關指令(如條件轉移指令)通過識別這些被影響的標誌暫存器來得知比較結果。
cmp指令格式:cmp op1,op2,效果為:計算op1-op2,但不儲存結果,僅影響標誌暫存器。如:cmp ax,ax指令執行後:zf=1,pf=1,sf=0,cf=0,of=0。
對於cmp ax,bx,當進行無符號數運算時:
若(ax)=(bx),則(ax)-(bx)=0,所以:zf=1;
若(ax)!=(bx),則(ax)-(bx)!=0,所以:zf=0;
若(ax)<(bx),則(ax)-(bx)將產生借位,所以:cf=1;
若(ax)>=(bx),則(ax)-(bx)不會產生借位,所以:cf=0;
若(ax)>(bx),則(ax)-(bx)不會產生借位,且不為0,所以:cf=0且zf=0;
若(ax)<=(bx),則(ax)-(bx)可能會借位,可能會等於0,所以:zf=1或者zf=1;
當進行有符號數運算時:
若(ax)=(bx),則(ax)-(bx)=0,所以:zf=1;
若(ax)!=(bx),則(ax)-(bx)!=0,所以:zf=0;
若(ax)<(bx),如果沒有發生溢位的話,那麼實際儲存的結果就是真實運算的結果,即of=0且sf=1;如果溢位的話,那麼實際儲存的結果與真實運算的結果相反,即of=1且sf=0;
若(ax)>(bx),如果沒有發生溢位的話,那麼實際儲存的結果就是真實運算的結果,即of=0且sf=0(當然of=0且sf=0時ax與bx也可能相等);如果溢位的話,那麼實際儲存的結果與真實運算的結果相反,即of=1且sf=1;
條件轉移指令
指令含義
檢測的相關標誌位
je等於則轉移
zf=1
jne不等於則轉移
zf=0
jb低於則轉移
cf=1
jnb不低於則轉移
cf=0
ja高於則轉移
cf=0且zf=0
jna不高於則轉移
cf=1或zf=1
其中e:equal,b:below,a,above。
雖然je進行的操作是zf=1時轉移,但是我們一般是將cmp和je等條件轉移指令聯合起來使用,效果為:兩數相等則轉移。
有符號數的比較和進行條件轉移與無符號數的原理相同。這裡主要是將cmp、標誌暫存器的相關位、條件轉移指令進行配合使用。
例:計算f000:0處32個位元組中,大小在[32,128]的資料的個數。
mov ax,of000h
mov ds,ax
mov,bx,0
mov dx,0
mov cx,32
s: mov al,[bx]
cmp al,32
jb s0
cmp al,128
ja s0
inc dx
s0:inc bx
loop s
組合語言之轉移指令
轉移指令 可以修改ip或同時修改cs和ip的指令統稱為轉移指令。短轉移ip的修改範圍 128 127 近轉移ip的修改範圍 32768 32767 1.操作符offset 例 assume cs codesg codesg segment start mov ax,offset start 相當於 ...
8086條件轉移指令JNE,JNZ
jnz jne 指令格式 轉移條件 說明 jnz jne 標號 zf 0 不等於0或不相等轉移 code segment assume cs code mov ax,5 mov bx,2 cmp ax,bx 兩數比較 不相等則轉移 jne ok iout mov ax,4c00h int 21h o...
組合語言轉移指令規則彙總
摘要 雖然jmp指令提供了控制轉移,但是它不允許進行任何複雜的判斷。80x86條件跳轉指令提供了這種判斷。條件跳轉指令是建立迴圈和實現其他條件執行語句,如if endif的基本要素。條件跳轉指令檢查乙個或多個標誌位,判斷它們是否匹配某個特殊條件 就像setcc指令 如果標誌匹配成功,該指令就將控制轉...