5.7 匯編語言程序設(shè)計舉例
匯編源程序的設(shè)計步驟
- 分析問題,建立數(shù)學模型
- 確定最佳算法
- 合理分配存儲單元和寄存器
- 繪制流程圖
- 編寫程序
- 調(diào)試程序
程序基本結(jié)構(gòu)
- 模塊化設(shè)計方法
? “自頂向下,逐步細化” - 結(jié)構(gòu)化編碼方法
? 順序、分支、循環(huán)三種基本結(jié)構(gòu)


- 順序程序設(shè)計
指令指針 IP 值線性增加,IP = IP + 1 - 條件程序設(shè)計
IP 值受標志位的影響而跳變,影響標志的指令 CMP、TEST、JXX - 循環(huán)程序設(shè)計
IP 值受計數(shù)器 CX 中的值不為零而循環(huán),影響標志的指令 DEC
5.7.2順序結(jié)構(gòu)程序設(shè)計
5.7.3分支結(jié)構(gòu)程序設(shè)計
-
分支程序的結(jié)構(gòu)形式
單純分支、并行分支結(jié)構(gòu)、選擇分支結(jié)構(gòu)
- 跳躍表法
需要在數(shù)據(jù)段事先安排一個按順序排列的轉(zhuǎn)移地址表。
輸入的數(shù)字作為偏移量。因為只有2個字節(jié)16位偏移地址,所以偏移量需要乘2。
多分支結(jié)構(gòu)的實現(xiàn),還可以使用跳躍表法,使程序能根據(jù)不同的條件轉(zhuǎn)移到多個程序分支中去。
關(guān)鍵是要理解間接尋址方式JMP指令
5.7.4循環(huán)結(jié)構(gòu)程序設(shè)計
- 循環(huán)程序結(jié)構(gòu)
三種循環(huán):計數(shù)循環(huán),當循環(huán),直到循環(huán)
循環(huán)程序由五個部分組成:
循環(huán)初始化部分,循環(huán)體,循環(huán)修改部分,循環(huán)控制部分,結(jié)束處理部分 - 循環(huán)控制方法
⑴計數(shù)控制(循環(huán)次數(shù)已知時,常用)
① 倒計數(shù) 將循環(huán)次數(shù)n ,送入循環(huán)計數(shù)器中,每循環(huán)一次,計數(shù)器減1,直到其值為0。
……
MOV CX,循環(huán)次數(shù)
LOOPA:……
……
DEC CX
JNE LOOPA
② 正計數(shù) 循環(huán)次數(shù)n 。0送入循環(huán)計數(shù)器中,每循環(huán)一次,計數(shù)器加1,直到其值為n。
……
MOV CX,0
LOOPA:……
……
INC CX
CMP CX, n
JNE LOOPA
⑵條件控制
循環(huán)次數(shù)未知。但是循環(huán)結(jié)束與某些條件(比較、運算的結(jié)果等等)相 關(guān),比較所要求的條件是否達到,未滿足繼續(xù)循環(huán),否則結(jié)束循環(huán)。 在解決實際問題時,往往要根據(jù)問題給定的已知條件,在認真分析 算法之后才能確定選用哪種方法。
⑶邏輯尺控制
循環(huán)體內(nèi)的處理任務(wù)在每次循環(huán)執(zhí)行時并無規(guī)律,但確實 需要連續(xù)運行。此時,可以給各處理操作標以不同的特征 位,所有特征位組合在一起,就形成了一個邏輯尺。
5.7.5子程序設(shè)計
- 子程序定義與調(diào)用
①定義:
過程名 PROC [NEAR/FAR]
…
RET
過程名 ENDP
②調(diào)用: CALL 過程名
?子程序名也具有段屬性,偏移地址屬性和類型屬性(FAR和 NEAR(缺省))。
? NEAR類型為段內(nèi)調(diào)用,即主子程序在同一個代碼段內(nèi),NEAR 可省略。
? FAR類型為段間調(diào)用,被另外代碼段調(diào)用的過程要定義為FAR過程
- 子程序的調(diào)用與返回
①段內(nèi)直接調(diào)用(重點)
格式:CALL 子程序名
功能:
a.(返回地址:跟在CALL后的下一條指令/斷點的EA) → ↓(SP)
b.目的地址(子程序名)EA→IP
② 返回指令RET
格式:RET/RET n
功能:a. 段內(nèi)返回 ↑(SP)→IP
b. 段間返回 ↑(SP)→IP,↑(SP)→CS
為了能正確返回主程序,在執(zhí)行子程序過程中,不管是否使用過堆棧,必須保證進入子程序時的棧頂與執(zhí)行RET時的棧頂一樣,否則不能正確返回
注意:
? CALL和RET不影響標志位;
? 是段內(nèi)返回還是段間返回要看子程序定義偽指令PROC后面的類;
? 對于RET n 表示返回時,清除堆棧中棧頂的n/2個無用參數(shù)(n為偶數(shù)), 在前述動作之后再作(SP)+n → SP,當使用堆棧傳遞子程序參數(shù)的時候經(jīng)常使用。
? 返回地址也稱為斷點,是CALL指令下一條指令的第一個字節(jié)地址 (段內(nèi)調(diào)用僅保存IP,段間調(diào)用保存CS和IP)。 - 編寫子程序時的注意事項
(1) 子程序的結(jié)構(gòu)
?子程序通常由子程序說明部分與代碼部分所組成。
?說明部分由下列幾部分所組成:子程序名稱,子程序功能,入口 參數(shù),出口參數(shù),使用的寄存器和存儲單元,調(diào)用的其它子程序,
?代碼部分:保護現(xiàn)場;根據(jù)入口參數(shù),獲取要處理的數(shù)據(jù);進行 數(shù)據(jù)處理;根據(jù)出口參數(shù),將處理后的數(shù)據(jù)送至指定的區(qū)域;恢復 現(xiàn)場;返回主程序。
(2)主程序與子程序的參數(shù)傳遞的方法
主程序為子程序提供入口參數(shù)
子程序根據(jù)入口參數(shù)進行一系列處理 程序返回結(jié)果給主程序
三種傳遞參數(shù)的方式:
a.寄存器法:適合于參數(shù)較少的情況,傳遞速度較快。
b.存儲器法:適合于參數(shù)較多的情況,事先需要在存儲器 中建立一個參數(shù)表。
c.堆棧法:適合于參數(shù)較多的情況,尤其是在子程序嵌套 與遞歸調(diào)用的情況。
(3)用堆棧傳遞參數(shù):轉(zhuǎn)向子程序前,將子程序所用參數(shù)壓入堆棧,進入子程序,由子程序從堆棧中取出所用的參數(shù)。
(4)子程序的嵌套和遞歸調(diào)用
子程序的嵌套:在一個子程序中又調(diào)用其他的子程序。(只要堆棧允許,嵌套的層次就可以不加限制)
子程序的遞歸調(diào)用:指在子程序嵌套調(diào)用時,調(diào)用的子程序就是它本身。


