一個算法用程序設(shè)計語言的語句有序地組合在一起加以描述,,其組合方式稱為程序的控制結(jié)構(gòu)或簡稱為程序結(jié)構(gòu),。程序的基本結(jié)構(gòu)形式有順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。
一、順序結(jié)構(gòu)
順序結(jié)構(gòu)是最簡單的,也是最基本的程序結(jié)構(gòu)形式,,這種結(jié)構(gòu)形式的程序的最大特點就是程序運行時從開始到結(jié)尾一直是按照編寫指令的順序執(zhí)行,且每條指令僅執(zhí)行一次,,具有順序結(jié)構(gòu)的程序或者程序段,,成為順序程序。
我們拿一個簡單的程序來說明匯編的順序程序設(shè)計,。
例:設(shè)兩個字存儲變量X和Y,, 編程實現(xiàn)這兩個變量的交換。
分析:由于存儲單元之間不能夠直接進行數(shù)據(jù)交換,,所以利用通用寄存器AX來作為交換的中介,。我在這里給出一個代碼范例:
DATA SEGMENT
X DW 1032H
Y DW 2043H
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP (0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1
BEGIN: MOV AX, DATA
MOV DS, AX
MOV AX, X
XCHG AX, Y
MOV X, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END
代碼分析:前面一部分是對數(shù)據(jù)以及堆棧的定義,這里我就不再多說了,,我們從BEGIN開始,,因為對于MOV來說,不能夠直接將DATA作為源操作數(shù),,DS作為目的操作數(shù),,所以要通過一個通用寄存器來實現(xiàn)兩者之間的賦值,MOV AX, X意為將X的值先保存在AX中,,而后執(zhí)行XCHG AX, Y將AX與Y的值進行交換,,此時Y里面存儲的便是X的值,AX中存儲的Y的值,。緊接著MOV X, AX再將AX中存儲的Y的值賦予X,,即實現(xiàn)X與Y值得交換。
二,、分支程序設(shè)計
實現(xiàn)分支程序需要有相應(yīng)的轉(zhuǎn)移指令的支持,,而轉(zhuǎn)移指令又分為無條件轉(zhuǎn)移指令與有條件轉(zhuǎn)移指令兩類,在有條件轉(zhuǎn)移指令中,,不同的條件往往是通過標(biāo)志寄存器中條件標(biāo)志的不同狀態(tài)反映的。因而,,分支程序設(shè)計中一個至關(guān)重要的問題是如何根據(jù)標(biāo)志寄存器中標(biāo)志位的不同狀態(tài),,配合使用合適的轉(zhuǎn)移指令實現(xiàn)程序的轉(zhuǎn)移。關(guān)于轉(zhuǎn)移指令請看我的另一篇文(http://yiluohuanghun.blog.51cto.com/3407300/940123)。
還是拿例子來說吧:X為存儲單元中的有符號字?jǐn)?shù)據(jù),,編寫程序?qū)崿F(xiàn)計算其絕對值,,并保存到原處。
分析:當(dāng)X>=0時,,X的絕對值就是它本身,,否則利用求負指令將X變號,并放回要原處,,下面我給出了一個程序,,大家可以參考下:
DATA SEGMENT
X DW 0F874H
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP (0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK1
BEGIN: MOV AX, DATA
MOV DS, AX
MOV AX, X
TEST AX, AX
JNS DONE
NEG X ;負指令NEG對X取反
DONE: MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
程序分析:TESTAX, AX;此處目的是為了重置標(biāo)志寄存器各位的值,,以便于下一條指令JNS使用標(biāo)志寄存器
三,、循環(huán)程序設(shè)計
在進行循環(huán)程序設(shè)計之前同分支程序設(shè)計一樣,都要先知道一個基本控制指令,,對于循環(huán)控制指令有如下4大類:
1,、LOOPTARGET
執(zhí)行的操作:先將CX<-(CX)-1,如果(CX)不等于0,,則將IP指向TARGET的偏移量
2,、LOOPZ/LOOPETARGET
執(zhí)行操作:先將CX<-(CX)-1,如果(CX)不等于0并且ZF=1,,則將IP指向TARGET的偏移量
3,、LOOPNZ/LOOPNE TARGET
執(zhí)行操作:先將CX<-(CX)-1,如果(CX)不等于0并且ZF不等于1,,則將IP指向TARGET的偏移
4,、JCXZTARGET
執(zhí)行操作:測試(CX)是否0,但不對CX寄存器進行修改,,如果(CX)=0,,那么IP指向TARGET的偏移量
下面還是以實例來說明問題:數(shù)據(jù)段的ARY數(shù)組中存放有10個無符號數(shù),試找出其中最大者送入MAX單元,。
分析:首先將數(shù)組中的第一個數(shù)取出放入AL,,然后依次與數(shù)組中的其他元素進行比較,將較大者放入AL中,,遍歷數(shù)組后,,AL中存放的就是最大的數(shù)。具體實現(xiàn)過成功如下:
DATA SEGMENT
ARY DB 17, 5, 40, 0, 67, 12, 34, 78, 32, 10
MAX DB ?
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP (0)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, SS:STACK1, DS:DATA
BEGIN: MOV AX, DATA
MOV DS, AX
MOV SI, OFFSET ARY ;SI指向ARY的第一個元素
MOV CX, 9 ;CX作循環(huán)次數(shù)計數(shù)
MOV AL, [SI] ;取第一個元素到AL
LOP: INC SI ;SI指向后一個元素
CMP AL, [SI] ;比較兩個數(shù)
JAE BIGER ;前一個元素大于后一個元素時轉(zhuǎn)移
MOV AL, [SI] ;取較大數(shù)到AL
BIGER: LOOP LOP ;(CX)不等于0 則轉(zhuǎn)移
MOV MAX, AL
MOV AH, 4CH
INT 21H
CODE ENDS
END BEGIN
以上就介紹著三種程序設(shè)計方式,。