分解组合法在程序设计中的应用
2013-09-04白云飞
白云飞
(运城学院 机电系,山西 运城 044000)
0 引言
用高级语言编写程序时,机器屏蔽了程序的细节,即机器级的实现,并且,用高级语言编写的程序可以在很多不同的机器上编译和执行。汇编语言在行为上接近于机器代码,形式上接近于高级语言,掌握汇编语言的程序设计,能明确高级语言程序运行的效率,从而优化高级语言程序,并且能获得更为安全的运行环境,提高程序执行的可靠性[1]。
模块化程序设计方法是按照各部分程序所实现的不同功能把程序划分成多个模块,各模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把它们连接起来,形成一个大程序[2]。这种设计方法实质上就是一种分解组合法,编程时使用分解组合法,可以采用循环结构、子程序结构,能改善程序的可读性,减少程序的存储空间,提高程序执行的效率。
1 分解组合法的具体应用
本文以一个实际的汇编语言源程序的编制来说明分解组合法的应用。任务是把存放在存储器中的任意一个四位十进制数转化为压缩BCD码形式存放。
四位十进制数在存储器中无论是以二进制形式存放,还是以BCD码形式存放,它们所表示的数的大小是一样的。用分解组合法,先把二进制形式的十进制数分解为千位值、百位值、十位值和个位值,然后再组合为BCD码形式。以提取千位值来说明其算法:将该十进制数的二进制形式记为[X]2,设置一个计数器,让[X]2重复执行减1 000操作,并测试CF的取值[3];[X]2每执行一次减1 000操作,然后测试CF=0时,计数器加1,这样,执行同样的操作步骤,直到CF=1停止计数,这时计数器的值就是千位值。
把千位值提取出来后,再执行一次加1 000操作,就得到了百位数。用同样的方法,可以提取出百位值、十位值和个位值。
接口就是加法操作所得到的要传递给后续分解用的数据。把千位值、百位值、十位值和个位值组合为BCD数时,可采用进行多次移位的方法来实现。
根据以上分析,编写完整的汇编语言源程序如下:
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;通过循环实现逐位提取并保存
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 ;组合个位数字
MOV AH,4CH
INT 21H
SUBB PROC NEAR ;子程序采用循环结构
MOV DX,0;给计数器DX清零
L3:SUB BX,AX
JC L4
INC DX
JMP L3
L4:ADD BX,AX
RET
SUBB ENDP
CODE ENDS
END START
该汇编语言源程序的总体结构是:主程序+子程序。主程序由两个循环体构成,子程序也是循环结构,符合模块化程序设计的要求。程序结构紧凑,层次清晰。
在计算机上用汇编程序MASM和链接程序LINK运行该汇编源程序,得到的实验结果如图1所示。
实验结果表明该汇编源程序能实现任务要求。
2 结论
以上汇编程序的编制表明使用分解组合法可以降低问题的难度,容易找到解决问题的方法和途径。在具体提取过程中,CPU执行的是减法和加法指令,在组合过程中,CPU执行的是移位和逻辑或指令,使用的电路简单、效率高、可靠性好。
图1 实验结果
[1] Randal E Bryant,David R O’Hallaron.深入理解计算机系统[M].龚奕利,雷迎春,译.北京:机械工业出版社,2010.
[2] 沈美明,温冬婵.IBM-PC汇编语言程序设计[M].北京:清华大学出版社,2006.
[3] 姚燕南,薛钧义.微型计算机原理及接口技术[M].北京:高等教育出版社,2004.