組合語言隨筆(3) 條件轉移指令和標誌暫存器

2021-10-23 13:45:50 字數 4260 閱讀 3874

標誌暫存器通常具有以下三種作用:

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指令 如果標誌匹配成功,該指令就將控制轉...