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