二、对称法:
本法实际上就是利用间接定址的指令,将原系对称处理,或可以调整成为对称型的程式,灵活调用。 下面这段程式,表面看来似乎毫不相干,但经过整理后,就有了眉目,然后再以暂存器间接定址,合并为一。像这种程式,规模越大,所节省的空间就越多。 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 ? ;?= 字框值 游标移动值: BWMOV DW ? ;依当前功能先 ;设定 视框上限: BWTOP DW ? ;?= 设定值 视框下限: BWBTM DW ? ;?= 设定值 视框左限: BWLFT DW ? ;?= 设定值 视框右限: BWRGT DW ? ;?= 设定值 右界边际值: BWADDX DW ? ;?= 字或图宽 .. 程式入口: CHKKEY DW CK47; 向左上移 DW CK48; 向上移 DW CK49; 向右上移 DW CRET; 无效 DW CK4B; 向左移 DW CRET; 无效 DW CK4D; 向右移 DW CRET; 无效 DW CK4F; 向左下移 DW CK50; 向下移 DW CK51; 向右下移 AX = 输入游标键扫瞄码 BP = 萤幕X向移动值 DX = 萤幕Y向移动值 ES:DI=萤幕记忆区位址
主流程: ( 已知 AL=0 AH=Scan-Code ) 1:KEYIN: 2: SUB AH,47H ; =HOME 3: JB KEYRET ; 无效 4: CMP AH,11 ; >扫瞄码范围 5: JA KEYRET 6: MOV BL,AH 7: SUB BH,BH 8: SHL BX,1 9: MOV AX,BWMOV ; 移动值 10: JMP CHKKEY[BX] ; 进入各处理程式 .. 40:CK47: 41: SUB DX,AX ; Y 向 42:CK4B: 43: NEG AX ; 向左为负 44:CK49: 45: ADD BP,AX ; X 向 46: JMP SHORT CKFUN 47:CK4D: 48: SUB DX,AX 49: JMP CK49 50:CK51: 51: ADD DX,AX 52: JMP CK49 53:CK48: 54: NEG AX ; 向上为负 55:CK50: 56: ADD DX,AX 57:CKFUN: ; 用变数观念检查「视窗」 58: CMP DX,BWTOP ; 超出上限? 59: JNS CKFUN1 60: MOV DX,BWTOP ; 上限值 61:CKFUN1: 62: CMP DX,BWBTM ; 超出下限? 63: JBE CKFUN2 64: MOV DX,BWBTM ; 下限值 65:CKFUN2: 66: CMP BP,BWLFT ; 超出左限? 67: JNS CKFUN3 68: MOV BP,BWLFT ; 左限值 69:CKFUN3: 70: PUSH BP 71: ADD BP,BWADDX ; 右限+边际值再比 72: CMP BP,BWRGT ; 超出右限? 73: POP BP 74: JBE CKFUN4 75: MOV BP,BWRGT ; 右限值 76:CKFUN4: 77: .. CKFUN4以下为功能处理,由前面的功能参数决定。 用这种方法,多种功能可以共用一个入口,程式精简且速度快。
 
2/2 首页 上一页 1 2 |