2011年5月22日 星期日

MASM_12

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

沒有留言:

張貼留言