⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 masm12.txt

📁 sad
💻 TXT
字号:
MASM 6.x 新增指令列表:  Glow Glove 制 (请体谅小弟辛苦,勿消去)

MASM 6.x 推出以久,但市面上有关之书籍及资料却少得可怜,小弟当初接触
MASM 6.x 时,辛辛苦苦才找出资料的,为了那些後进不用踏著先烈的血迹前
扑後继,特将小弟「翻」出来的东东公布出来。

这些指令都是小弟从书上(厚颜无耻,在老板的白眼下辛苦抄下来的)
及MASM 6.0 之范例程式中翻出来的,若有遗落疏失,请包涵。
请体谅小弟之辛苦,勿将小弟的ID消去。

MASM 6.x与MASM 5.x最大不同,在於6.x 比5.x 更高阶化了(或说更PASCAL化),
其内提供了判断、回圈、模组化副程式等,各种令组合语言使用者望穿秋水之指
令,看完内容,请不要感动的痛哭流涕,或恨他为什麽不早点出来。

运算符号:
    == : 等於        &  : 位元测试
    != : 不等於      !  : 否 NOT
    >  : 大於        && : 且 AND
    <  : 小於        || : 或 OR

辅助运算符号:
    ZERO?     : ZERO ZF=1,ZR        !ZERO?     : NOT ZERO ZF=0,NZ
    CARRY?    : CARRY CF=1,CY       !CARRY?    : NOT CARRY CF=0,NC
    OVERFLOW? : OVERFLOW,OV         !OVERFLOW? : NOT OVERFLOW,NV
    SIGN?     : NEGATIVE,NG         !SIGN?     : PLUS,PL
    PARITY?   : PARITY EVEN,PE      !PARITY?   : PARITY ODD,PO

Examples:
    .IF AX == 1               .REPEAT
    .IF ZERO?                 .UNTIL ZERO?
    .IF !(AX & 0Fh)
    .IF AL=ESC || AL=CR
    看到这些指令了吗? 是不是似曾相识,期待以久了。

MASM 6.x 新增指令列表_#2 :  Glow Glove 制 (请体谅小弟辛苦,勿消去)

这些指令都是小弟从书上及MASM 6.0 之范例程式中翻出来的,
若有遗落疏失,请包涵。

程式指令:
    .STARTUP       : 程式开始,校准DS节区,
    .EXIT [result] : 程式结束,返回DOS, result 可指定ERRORLEVEL值

引申:
    .STARTUP : mov dx,@data
               mov ds,dx
                  .
                  .   此处不明用途,故还是自己做程式码较小
    .EXIT    : mov ah,4ch
               int 21h
    .EXIT 1  : mov ax,4c01h
               int 21h

判断式:
    .IF <expression>
         .
    .ELSEIF <expression1>
         .
    .ELSE
         .
    .ENDIF

.ELSEIF 及.ELSE 为非必要之动作,写过高阶语言的应该不难了解才对!

MASM 6.x 新增指令列表_#3 :  Glow Glove 制 (请体谅小弟辛苦,勿消去)

这些指令都是小弟从书上及MASM 6.0 之范例程式中翻出来的,
若有遗落疏失,请包涵。

回圈指令:
    (1) 前测式:
        .WHILE <expression>
              .
              .
        .ENDW
        当条件成立,即执行回圈内,否则执行回圈後之动作

    (2) 後测式:
    1.  .REPEAT
              .
              .
        .UNTIL <expression>
      or
    2.  .REPEAT
              .
              .
        .UNTILCXZ <expression>

     1. 回圈一直到条件成立即停止回圈
     2. 同1 ,但加上判断CX是否为0 (OR的关系,即条件为真或CX==0)

辅助指令:
    .BREAK <expression>
    .COUNTINE <expression>

    配合上述回圈指令运用
    .BREAK    可中止回圈
    .COUNTINE 可跳至回圈开头
    可在其後加上叙述,叙述成立才动作

嗯! 愈看愈像PASCAL了

Examples:

    .WHILE AX==1 || !ZERO?     .REPEAT
            .                         .
    .ENDW                      .UNTIL (AX & 1)

    .REPEAT
            .
      .BREAK .IF ZERO?
            .
      .COUNTINE
            .
    .UNTILCXZ (DX == 0)

引申:
    上述之判断式及回圈,其实就是CMP XX,YY
                                Jxx xxxx,LOOPxx xxxx
                                之组合。
    其内动作复杂,小弟写不出来 :~~( 请写过MASM 5.x的人自行
    体会那种复杂的古老方式。

MASM 6.x 新增指令列表_#4 :  Glow Glove 制 (请体谅小弟辛苦,勿消去)

这些指令都是小弟从书上及MASM 6.0 之范例程式中翻出来的,
若有遗落疏失,请包涵。

副程式模组指令:

PROTO  : 副程式宣告,类似QB之DECLARE (可置於内含档,或程式开头任何一处)
INVOKE : 副程式呼叫,类似ASM 之CALL,但可传递参数
         以下之叙述多以QB为对象,因为小弟酷爱QB.

完整语法:

<Subname> PROTO <language type> [exp1:....,][exp2:....]
  < >:必需加上之叙述
  [ ]:视其需要之叙述,可有可无
  Subname : 副程式名称
  language type : 连结之语言, 如PASCAL,BASIC,C
  exp1:....,exp2:.... :传递之参数及其型态, 型态叙述若加上PTR 则为传址

  语言: PASCAL=BASIC,组合连结组合用PASCAL或BASIC 较顺手
  传值或传址:  X:byte,Y:ptr byte
               则X 为传值,占1 byte,Y 为传址,占2 byte (因位址占2 byte)

  注!:叙述间之分隔符号要搞清楚是「空格」或「逗号」。
      语言中之「BASIC 」为编译式BASIC ,如QuickBASIC 4.X, BASIC Compiler 7.X

INVOKE <subname>,[exp1,exp2,...]
  subname : 副程式名称
  exp1,exp2,.. : 参数

宣告范例:
    (1) 主程式宣告
      .MODEL SMALL
        Subname PROTO BASIC X:BYTE,Y:BYTE,Result:PTR WORD
      .DATA
           SX db 1
           SY db 2
           ec dw 0
      .CODE
           INVOKE Subname,SX,SY,ec
      .STACK
      END

    (2) 副程式宣告
       .MODEL SMALL,BASIC 此语言叙述可有可无,影向副程式之参数传递,若
                          副程式中已宣告其语言,则此可免写。
         Subname PROTO X:BYTE,Y:BYTE,Result:PTR WORD
           此叙述在主、副程式中,都应加上确保组译无误
       .CODE
         Subname PROC BASIC USES bx dx si ,   此处叙述之陈述重要,各叙述
                      X:BYTE ,                之分隔符号尤应写好。
                      Y:BYTE ,                BASIC:连结之语言
                      Result:PTR WORD         USES :会被改变原值的暂存器
                                                    通知ASM 将其原值保存
                    .
                    .
                 ret      ASM 会自动加上欲清除之堆叠数
         Subname ENDP
       END

引申:
    PROTO 类似EXTRN 但较其叙述更完善

    INVOKE与CALL之差别,INVOKE可加上参数传递,而CALL则需自己动手。

    例: INVOKE Subname,X,Y
         组译为: MOV AX,X  ;此处叙述不定,视参数型态
                 PUSH AX
                 MOV AX,Y
                 PUSH AX
                 CALL Subname
         其中INVOKE会帮使用者做好参数堆入堆叠之动作

    PROC: 加上语言叙述,会以该语言之参数传递方式,为使用者完成参数取得
          加上USES叙述,会替使用者将指定之暂存器堆入堆叠

    例: Subname PROC BASIC USES bx dx,
                     X:BYTE,
                     Y:BYTE
                    .
                    .
                ret
        Subname ENDP

        组译为:
                 PUSH BP     ┐ 有参数之传递,故做校准BP之动作
                 MOV BP,SP   ┘
                 PUSH BX     ┐ 使用者指定保存之暂存器之堆入
                 PUSH DX     ┘
                 MOV X,[BP+6] 因有basic 叙述,故采basic 之参数传递方式,
                 MOV Y,[BP+4] 第一个参数在堆叠下方,第二个在上面
                 .            详见「QuickBASIC专题实作-第三波」
                 .            或BASIC 使用手册
                 .
                 .
                 POP DX      ┐ 使用者指定保存之暂存器取回
                 POP BX      ┘ 堆入及取回动作,组译时皆替使用者完成
                 POP BP
                 RET 2       2 为组译时加上,因为有两个byte的参数传递。


请不要怀疑引申部分之正确与否,其中之内容都是我组译连结後,用
DEBUG 去看出来的,保证正确,若用CODEVIEW则更容易了解。

关於程式模组方面,尚提供了一些更方便的.COM档写法及一些叙述,但小弟因
功力不够,所以看不太懂,有兴趣知道的,可自行从MASM 6.x的范例中挖宝。

此外,MASM 6.x尚提供了一些公用程式,其中6.0 for DOS&OS/2, 6.1 for DOS&WIN
不过其中的PWB IDE 环境跟中文不太相容,CODEVIEW若非双萤幕,则难展威力,其他
的公用程式如LIB 跟LINK跟以前的差不多,其他的小弟不知道用途 :_(  。

欲使用MASM 6.x者,需最少须具备ML.EXE,ML.ERR及LINK.EXE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -