白云飛
(運城學院 機電系,山西 運城 044000)
用高級語言編寫程序時,機器屏蔽了程序的細節(jié),即機器級的實現(xiàn),并且,用高級語言編寫的程序可以在很多不同的機器上編譯和執(zhí)行。匯編語言在行為上接近于機器代碼,形式上接近于高級語言,掌握匯編語言的程序設計,能明確高級語言程序運行的效率,從而優(yōu)化高級語言程序,并且能獲得更為安全的運行環(huán)境,提高程序執(zhí)行的可靠性[1]。
模塊化程序設計方法是按照各部分程序所實現(xiàn)的不同功能把程序劃分成多個模塊,各模塊在明確各自的功能和相互間的連接約定后,就可以分別編制和調試程序,最后再把它們連接起來,形成一個大程序[2]。這種設計方法實質上就是一種分解組合法,編程時使用分解組合法,可以采用循環(huán)結構、子程序結構,能改善程序的可讀性,減少程序的存儲空間,提高程序執(zhí)行的效率。
本文以一個實際的匯編語言源程序的編制來說明分解組合法的應用。任務是把存放在存儲器中的任意一個四位十進制數(shù)轉化為壓縮BCD碼形式存放。
四位十進制數(shù)在存儲器中無論是以二進制形式存放,還是以BCD碼形式存放,它們所表示的數(shù)的大小是一樣的。用分解組合法,先把二進制形式的十進制數(shù)分解為千位值、百位值、十位值和個位值,然后再組合為BCD碼形式。以提取千位值來說明其算法:將該十進制數(shù)的二進制形式記為[X]2,設置一個計數(shù)器,讓[X]2重復執(zhí)行減1 000操作,并測試CF的取值[3];[X]2每執(zhí)行一次減1 000操作,然后測試CF=0時,計數(shù)器加1,這樣,執(zhí)行同樣的操作步驟,直到CF=1停止計數(shù),這時計數(shù)器的值就是千位值。
把千位值提取出來后,再執(zhí)行一次加1 000操作,就得到了百位數(shù)。用同樣的方法,可以提取出百位值、十位值和個位值。
接口就是加法操作所得到的要傳遞給后續(xù)分解用的數(shù)據(jù)。把千位值、百位值、十位值和個位值組合為BCD數(shù)時,可采用進行多次移位的方法來實現(xiàn)。
根據(jù)以上分析,編寫完整的匯編語言源程序如下:
DATA SEGMENT
BINNUM DW 9999
DATA1DW 1000,100,10
THOUB DW 3DUP (0)
BCD DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV BX,BINNUM
LEA DI,DATA1
LEA SI,THOUB
MOV CX,3
L1:MOV AX,[DI]
CALL SUBB;調用提取子程序
MOV [SI],DX ;送存儲單元保存
INC SI
INC SI
INC DI
INC DI
LOOP L1;通過循環(huán)實現(xiàn)逐位提取并保存
MOV DX,3
MOV SI,OFFSET THOUB
L2:MOV AX,[SI]
OR BCD,AX
MOV CL,4
SHL BCD,CL
INC SI
INC SI
DEC DX
JNZ L2;左移三次,每次移四位組合三次
OR BCD,BX ;組合個位數(shù)字
MOV AH,4CH
INT 21H
SUBB PROC NEAR ;子程序采用循環(huán)結構
MOV DX,0;給計數(shù)器DX清零
L3:SUB BX,AX
JC L4
INC DX
JMP L3
L4:ADD BX,AX
RET
SUBB ENDP
CODE ENDS
END START
該匯編語言源程序的總體結構是:主程序+子程序。主程序由兩個循環(huán)體構成,子程序也是循環(huán)結構,符合模塊化程序設計的要求。程序結構緊湊,層次清晰。
在計算機上用匯編程序MASM和鏈接程序LINK運行該匯編源程序,得到的實驗結果如圖1所示。
實驗結果表明該匯編源程序能實現(xiàn)任務要求。
以上匯編程序的編制表明使用分解組合法可以降低問題的難度,容易找到解決問題的方法和途徑。在具體提取過程中,CPU執(zhí)行的是減法和加法指令,在組合過程中,CPU執(zhí)行的是移位和邏輯或指令,使用的電路簡單、效率高、可靠性好。
圖1 實驗結果
[1] Randal E Bryant,David R O’Hallaron.深入理解計算機系統(tǒng)[M].龔奕利,雷迎春,譯.北京:機械工業(yè)出版社,2010.
[2] 沈美明,溫冬嬋.IBM-PC匯編語言程序設計[M].北京:清華大學出版社,2006.
[3] 姚燕南,薛鈞義.微型計算機原理及接口技術[M].北京:高等教育出版社,2004.