AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

汇编语言---程式设计 (4)

51自学网 http://www.51zixue.net


二、对称法:

    本法实际上就是利用间接定址的指令,将原系对称处理,或可以调整成为对称型的程式,灵活调用。
    下面这段程式,表面看来似乎毫不相干,但经过整理后,就有了眉目,然后再以暂存器间接定址,合并为一。像这种程式,规模越大,所节省的空间就越多。
    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以下为功能处理,由前面的功能参数决定。
    用这种方法,多种功能可以共用一个入口,程式精简且速度快。

 
 

上一篇:汇编语言---程式设计 (5)  下一篇:汇编语言---程式设计 (3)