📄 masm6
字号:
MASM 6.x 新增指令列表: MASM 6.x 推出以久,但市面上有关之书籍及资料却少得可怜,小弟当初接触MASM 6.x 时,辛辛苦苦才找出资料的,为了那些後进不用踏着先烈的血迹前扑後继,特将小弟「翻」出来的东东公布出来。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,POExamples: .IF AX == 1 .REPEAT .IF ZERO? .UNTIL ZERO? .IF !(AX & 0Fh) .IF AL=ESC || AL=CR 看到这些指令了吗? 是不是似曾相识,期待以久了。MASM 6.x 新增指令列表_#2 : 这些指令都是小弟从书上及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 : 这些指令都是小弟从书上及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 : 这些指令都是小弟从书上及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.XINVOKE <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 Glow Glove 制
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -