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
沒有留言:
張貼留言