汇编语言--微机CPU的指令系统(五)(循环指令)
(8)循環(huán)指令
循環(huán)結(jié)構(gòu)是程序的三大結(jié)構(gòu)之一。為了方便構(gòu)成循環(huán)結(jié)構(gòu),匯編語言提供了多種循環(huán)指令,這些循環(huán)指令的循環(huán)次數(shù)都是保存在計數(shù)器CX或ECX中。除了CX或ECX可以決定循環(huán)是否結(jié)束外,有的循環(huán)指令還可由標(biāo)志位ZF來決定是否結(jié)束循環(huán)。
在高級語言中,循環(huán)計數(shù)器可以遞增,也可遞減,但匯編語言中,CX或ECX只能遞減,所以,循環(huán)計數(shù)器只能從大到小。在程序中,必須先把循環(huán)次數(shù)賦給循環(huán)計數(shù)器。
匯編語言的循環(huán)指令都是放在循環(huán)體的下面,在循環(huán)時,首先執(zhí)行一次循環(huán)體,然后把循環(huán)計數(shù)器CX或ECX減1。當(dāng)循環(huán)終止條件達到滿足時,該循環(huán)指令下面的指令將是下一條被執(zhí)行的指令,否則,程序?qū)⑾蛏限D(zhuǎn)到循環(huán)體的第一條指令。
在循環(huán)未終止,而向上轉(zhuǎn)移時,規(guī)定:該轉(zhuǎn)移只能是一個短轉(zhuǎn)移,即偏移量不能超過128,也就是說循環(huán)體中所有指令碼的字節(jié)數(shù)之和不能超過128。如果循環(huán)體過大,可以用后面介紹的“轉(zhuǎn)移指令”來構(gòu)造循環(huán)結(jié)構(gòu)。
循環(huán)指令本身的執(zhí)行不影響任何標(biāo)志位。
1、循環(huán)指令(Loop Until Complete)
循環(huán)指令LOOP的一般格式:
LOOP 標(biāo)號
LOOPW 標(biāo)號 ;CX作為循環(huán)計數(shù)器,80386+
LOOPD 標(biāo)號 ;ECX作為循環(huán)計數(shù)器,80386+
循環(huán)指令的功能描述:
(CX)=(CX)-1或(ECX)=(ECX)-1;
如果(CX)≠0或(ECX)≠0,轉(zhuǎn)向“標(biāo)號”所指向的指令,否則,終止循環(huán),執(zhí)行該指令下面的指令。
例5.13 編寫一段程序,求1+2+…+1000之和,并把結(jié)果存入AX中。
解:
方法1:因為計數(shù)器CX只能遞減,所以,可把求和式子改變?yōu)?#xff1a;1000+999+…+2+1。
…
XOR AX, AX
MOV CX, 1000D
again: ADD AX, CX ;計算過程:1000+999+…+2+1
LOOP again
…
方法2:不用循環(huán)計數(shù)器進行累加,求和式子仍為: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、相等或為零循環(huán)指令(Loop While Equal or Loop While Zero)
相等或為零循環(huán)指令的一般格式:
LOOPE/LOOPZ 標(biāo)號
LOOPEW/LOOPZW 標(biāo)號 ;CX作為循環(huán)計數(shù)器,80386+
LOOPED/LOOPZD 標(biāo)號 ;ECX作為循環(huán)計數(shù)器,80386+
這是一組有條件循環(huán)指令,它們除了要受CX或ECX的影響外,還要受標(biāo)志位ZF的影響。其具體規(guī)定如下:
(1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改變?nèi)魏螛?biāo)志位)
(2)、如果循環(huán)計數(shù)器≠0且ZF=1,則程序轉(zhuǎn)到循環(huán)體的第一條指令,否則,程序?qū)?zhí)行該循環(huán)指令下面的指令。
3、不等或不為零循環(huán)指令(Loop While Not Equal or Loop While Not Zero)
不等或不為零循環(huán)指令的一般格式:
LOOPNE/LOOPNZ 標(biāo)號
LOOPNEW/LOOPNZW 標(biāo)號 ;CX作為循環(huán)計數(shù)器,80386+
LOOPNED/LOOPNZD 標(biāo)號 ;ECX作為循環(huán)計數(shù)器,80386+
這也是一組有條件循環(huán)指令,它們與相等或為零循環(huán)指令在循環(huán)結(jié)束條件上有點不同。其具體規(guī)定如下:
(1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改變?nèi)魏螛?biāo)志位)
(2)、如果循環(huán)計數(shù)器≠0且ZF=0,則程序轉(zhuǎn)到循環(huán)體的第一條指令,否則,程序?qū)?zhí)行該循環(huán)指令下面的指令。
4、循環(huán)計數(shù)器為零轉(zhuǎn)指令(Jump if CX/ECX is Zero)
在前面的各類循環(huán)指令中,不管循環(huán)計數(shù)器的初值為何,循環(huán)體至少會被執(zhí)行一次。當(dāng)循環(huán)計數(shù)器的初值為0時,通常的理解應(yīng)是循環(huán)體被循環(huán)0次,即循環(huán)體一次也不被執(zhí)行。其實不然,循環(huán)體不是不被執(zhí)行,而是會被執(zhí)行65536次(用CX計數(shù))或4294967296次(幾乎是死循環(huán),用ECX計數(shù))。
為了解決指令的執(zhí)行和常規(guī)思維之間差異,指令系統(tǒng)又提供了一條與循環(huán)計數(shù)器有關(guān)的指令——循環(huán)計數(shù)器為零轉(zhuǎn)指令。該指令一般用于循環(huán)的開始處,其指令格式如下:
JCXZ 標(biāo)號 ;當(dāng)CX=0時,則程序轉(zhuǎn)移標(biāo)號處執(zhí)行
JECXZ 標(biāo)號 ;當(dāng)ECX=0時,則程序轉(zhuǎn)移標(biāo)號處執(zhí)行,80386+
例5.14 編寫一段程序,求1+2+…+k(K≥0)之和,并把結(jié)果存入AX中。
解:
…
K DB ? ;變量定義
…
XOR AX, AX
MOV CX, K
JCXZ next
again: ADD AX, CX ;計算過程: K+(K-1)+…+2+1
LOOP again
next: …
思考題:假設(shè)變量K的值為0,并且在循環(huán)體的前面沒有寫指令“JCXZ next”,這時求出的“和”AX的值是什么?
轉(zhuǎn)載于:https://www.cnblogs.com/CIreland/p/9967374.html
總結(jié)
以上是生活随笔為你收集整理的汇编语言--微机CPU的指令系统(五)(循环指令)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java笔记 - 黑马程序员_03(继承
- 下一篇: 操作系统 实时调度