1. 程式人生 > >組合語言--微機CPU的指令系統(五)(迴圈指令)

組合語言--微機CPU的指令系統(五)(迴圈指令)

(8)迴圈指令

迴圈結構是程式的三大結構之一。為了方便構成迴圈結構,組合語言提供了多種迴圈指令,這些迴圈指令的迴圈次數都是儲存在計數器CX或ECX中。除了CX或ECX可以決定迴圈是否結束外,有的迴圈指令還可由標誌位ZF來決定是否結束迴圈。

在高階語言中,迴圈計數器可以遞增,也可遞減,但組合語言中,CX或ECX只能遞減,所以,迴圈計數器只能從大到小。在程式中,必須先把迴圈次數賦給迴圈計數器。

組合語言的迴圈指令都是放在迴圈體的下面,在迴圈時,首先執行一次迴圈體,然後把迴圈計數器CX或ECX減1。當迴圈終止條件達到滿足時,該迴圈指令下面的指令將是下一條被執行的指令,否則,程式將向上轉到迴圈體的第一條指令。

在迴圈未終止,而向上轉移時,規定:該轉移只能是一個短轉移,即偏移量不能超過128,也就是說迴圈體中所有指令碼的位元組數之和不能超過128。如果迴圈體過大,可以用後面介紹的“轉移指令”來構造迴圈結構。

迴圈指令本身的執行不影響任何標誌位。

1、迴圈指令(Loop Until Complete)

迴圈指令LOOP的一般格式:

LOOP 標號

LOOPW 標號      ;CX作為迴圈計數器,80386+

LOOPD 標號      ;ECX作為迴圈計數器,80386+

迴圈指令的功能描述:

(CX)=(CX)-1或(ECX)=(ECX)-1;

如果(CX)≠0或(ECX)≠0,轉向“標號”所指向的指令,否則,終止迴圈,執行該指令下面的指令。

clip_image002

例5.13 編寫一段程式,求1+2+…+1000之和,並把結果存入AX中。

解:

方法1:因為計數器CX只能遞減,所以,可把求和式子改變為:1000+999+…+2+1。

XOR AX, AX

MOV CX, 1000D

again: ADD AX, CX ;計算過程:1000+999+…+2+1

LOOP again

方法2:不用迴圈計數器進行累加,求和式子仍為:1+2+…+999+1000。

XOR AX, AX

MOV CX, 1000D

MOV BX, 1

again: ADD AX, BX ;計算過程:1+2+…+999+1000

INC BX

LOOP again

從程式段的效果來看:方法1要比方法2好。

2、相等或為零迴圈指令(Loop While Equal or Loop While Zero)

相等或為零迴圈指令的一般格式:

LOOPE/LOOPZ 標號

LOOPEW/LOOPZW 標號  ;CX作為迴圈計數器,80386+

LOOPED/LOOPZD 標號   ;ECX作為迴圈計數器,80386+

這是一組有條件迴圈指令,它們除了要受CX或ECX的影響外,還要受標誌位ZF的影響。其具體規定如下:

(1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改變任何標誌位)

(2)、如果迴圈計數器≠0且ZF=1,則程式轉到迴圈體的第一條指令,否則,程式將執行該迴圈指令下面的指令。

clip_image004

3、不等或不為零迴圈指令(Loop While Not Equal or Loop While Not Zero)

不等或不為零迴圈指令的一般格式:

LOOPNE/LOOPNZ 標號

LOOPNEW/LOOPNZW 標號  ;CX作為迴圈計數器,80386+

LOOPNED/LOOPNZD 標號  ;ECX作為迴圈計數器,80386+

這也是一組有條件迴圈指令,它們與相等或為零迴圈指令在迴圈結束條件上有點不同。其具體規定如下:

(1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改變任何標誌位)

(2)、如果迴圈計數器≠0且ZF=0,則程式轉到迴圈體的第一條指令,否則,程式將執行該迴圈指令下面的指令。

clip_image006

4、迴圈計數器為零轉指令(Jump if CX/ECX is Zero)

在前面的各類迴圈指令中,不管迴圈計數器的初值為何,迴圈體至少會被執行一次。當迴圈計數器的初值為0時,通常的理解應是迴圈體被迴圈0次,即迴圈體一次也不被執行。其實不然,迴圈體不是不被執行,而是會被執行65536次(用CX計數)或4294967296次(幾乎是死迴圈,用ECX計數)。

為了解決指令的執行和常規思維之間差異,指令系統又提供了一條與迴圈計數器有關的指令——迴圈計數器為零轉指令。該指令一般用於迴圈的開始處,其指令格式如下:

JCXZ 標號   ;當CX=0時,則程式轉移標號處執行

JECXZ 標號   ;當ECX=0時,則程式轉移標號處執行,80386+

例5.14 編寫一段程式,求1+2+…+k(K≥0)之和,並把結果存入AX中。

解:

K DB ? ;變數定義

XOR AX, AX

MOV CX, K

JCXZ next

again: ADD AX, CX ;計算過程: K+(K-1)+…+2+1

LOOP again

next: …

思考題:假設變數K的值為0,並且在迴圈體的前面沒有寫指令“JCXZ next”,這時求出的“和”AX的值是什麼?