汇编语言程序设计(四)
2007-04-25 09:30:00 来源:WEB开发网第六节 特殊技巧的运用
技巧的运用,关系组合语言的效率甚钜,虽然其重要性比不上整体规划,但也可以弥补规划的不足。
由于「技巧」无法严格定义,兹将几种较常用的技巧介绍如下:
一、变数法:
我非常反对在程式中采用「常数」的观念,因为常数是固定的,无法灵活应用。例如在 IBM PC 的 BIOS 中,萤幕游标上、下、左、右位置固定设为 0,25,0,80 等常数值。每次移动都受到这四个值的限制,故而形成不变的「视区」。若将这些常数改为变数,且容许使用者自行改变,则立即有了可变「视窗」的功能。
也就是说,萤幕上、下、左、右四个位置,所围起来的区域,就是我们视觉及资料所限制的「视窗」,所有资料显示,在系统程式的控制下,无法超出此区。
如果此四个位置值是变数,则使用者可以随意设定所需数值,如是则灵活方便,也就是所谓的视窗处理。
在下文三、虚拟法例中,CKFUN 该段程式即为用变数处理视窗的范例。下面这段程式,亦为变数法的一种应用, MAP87和MAP9A 中,均需调用子程式DYBPJ1,唯一不同者,是在该子程式中,又需分别调用不同的子程式。共用DYBPJ1的方法,是先将不同子程式的位址,放在BP中,再行调用。
1:MAP87:
2: MOV BP,OFFSET MAPF4
3: CALL MOVS211
4: CALL DYBPJ1
5: MOV DL,AH
6: ..
11:MAP9A:
12: MOV BP,OFFSET MAP46
13: CALL DYBPJ1
14: MOV AH,1
15: ..
20:DYBPJ1:
21: PUSH BX
22: PUSH DX
23: MOV DH,DL
24: CALL BP
25: POP AX
26: XCHG DH,AH
27: POP BX
28:DYBPJRT:
29: RET
二、对称法:
本法实际上就是利用间接定址的指令,将原系对称处理,或可以调整成为对称型的程式,灵活调用。
下面这段程式,表面看来似乎毫不相干,但经过整理后,就有了眉目,然后再以暂存器间接定址,合并为一。像这种程式,规模越大,所节省的空间就越多。
1:ABCD:
2: CMP DX,BUFA
3: JB ABCD1
4: CMP CL,BUFD
5: JB ABCD1
6: MOV BUFC,CL
7: INC BUFE
8: MOV BUFB,DX
9: DEC BUFF
10: ABCD1:
11: ..
12: ..
与另一段程式:
20:EFGH:
21: CMP BX,BUFG
22: JB EFGH1
23: CMP CH,BUFH
24: JB EFGH1
25: INC BUFK
26: DEC BUFL
27: MOV BUFI,BX
28: MOV BUFJ,CH
29:EFGH1:
30: ..
31: ..
看来分别很大,先经过整理,得到左右两组程式:
EFGH: ABCD:
CMP BX,BUFG CMP DX,BUFA
JB EFGH1 JB ABCD1
CMP CH,BUFH CMP CL,BUFD
JB EFGH1 JB ABCD1
INC BUFK INC BUFE
DEC BUFL DEC BUFF
MOV BUFI,BX MOV BUFB,DX
MOV BUFJ,CH MOV BUFC,CL
EFGH1: ABCD1:
.. ..
.. ..
对照之下可以看出,其所不同的,只是暂存器及缓冲器的分别而已。这种程式的出现,是由于事先规划不当,未能通盘考虑,头痛医头,脚痛医脚。原可以把暂存器及缓冲器统一运用,现在木已成舟,想要变更很可能影响大局。
其次是写作的风格及习惯没有养成,在用指令时,信手拈来,以致两段程式,两种写法!
现在唯一的补救方法,是利用间接定址法,先将两组不同的缓冲器,照相对次序排列妥当,再改写程式。
1:ABCD:
2: MOV SI,OFFSET BUFA
3: MOV DI,OFFSET BUFB
4: MOV BX,DX
5: MOV CH,CL
6: JMP SHORT EFGH1
7:EFGH:
8: MOV SI,OFFSET BUFG
9: MOV DI,OFFSET BUFI
10:EFGH1:
11: CMP BX,[SI]
12: JB EFGH2
13: CMP CH,[SI+2]
14: JB EFGH2
15: MOV [DI],BX
16: MOV [DI+2],CH
17: INC BYTE PTR[DI+3]
18: DEC BYTE PTR[DI+4]
19:EFGH2:
20: ..
其缓冲器的相对顺序,如下所示:
35:BUFA DW 0
36:BUFD DB 0
37:BUFB DW 0
38:BUFC DB 0
39:BUFE DB 0
40:BUFF DB 0
41:..
65:BUFG DW 0
66:BUFH DB 0
67:BUFI DW 0
68:BUFJ DB 0
69:BUFK DB 0
70:BUFL DB 0
凡对称形式或结构相同的程式,都可以采用这种技巧。
三、虚拟法:
对来处不同的资料,只要性质相同,都可以采用虚拟的技巧,将各种参数事先设妥,利用参数统一处理。
兹有一程式,系供萤幕画图之用,所有功能皆用游标完成之,特以此段处理游标的程式为例说明如后。
先虚拟各种功能及缓冲器:
区段位移: BBBLKMOV DB ? ;?= 位移值
十字游标: BBCROCSR DB ? ;?= 位移值
视框移动: BBFRMMOV DB ? ;?= 位移值
画笔作图: BBDRW DB ? ;?= 画笔宽
橡皮擦: BBDEL DB ? ;?= 橡皮宽
闪动游标: BBCSR DB ? ;?= 游标宽
文字显示: BBCHRDSP DB ? ;?= 字框值
更多精彩
赞助商链接