1、宏汇编语言的基本语法7宏汇编语言的基本语法一个完整的宏汇编语言源程序(两个字节12H、34H相加):DATSEGMENTPLUS1DB12HPLUS2DB34HSUMDB?DATENDSPROGSEGMENTMAINPROCFARASSUMECS:PROG,DS:DATSTART:PUSHDSXORAX,AXPUSHAXMOVAX,DATMOVDS,AXMOV AL,PLUS1ADDAL,PLUS2MOV SUM,ALRETMAINENDPPROGENDSEND START汇编语言中的两种语句:1指令语句(例如 MOV AX ,DAT)2伪指令语句(例如 DAT SEGMENT ; PLUS1
2、 DB 12H等)伪指令功能:数据定义,分配存储区,程序分段,指示程序结束等伪指令语句与机器指令语句的最大区别:机器指令语句标号后有冒号“:”伪指令语句标号后无冒号“:”一 伪指令语句格式 标号名伪指令操作数1,2,3;注释 带 者可省略例: DAT SEGMENT PLUS1 DB 12H,23H二 常数、变量、标号1 常数在程序运行中不发生改变 (例:立即数,变量的初值)有几种表示法:(1) 二进制 10100011B(2) 八进制 176547O(3) 十六进制 7FH,7DF6H(4) 十进制 245D,36,76(5) 实数(浮点)(6) 字符串 (例A即为41H;AB即为41H、4
3、2H) 2 变量存放在存储器数据段内单元的数据,运行时可修改,也可赋初值。在程序中是以变量名的形式出现(以直接寻址方式引用) MOV AL,PLUS2 = MOV AL,0002H(1) 变量定义及存储器分配伪指令DB 定义字节 1字节DW 定义字 2字节DD 定义双节 4字节DQ 定义四节 8字节12H23H56H78HDT 定义10字节 10字节2000H:0000H:0001HPLUS1DATA1 例:PLUS1 DB 12H DATA1 DB 23H,56H DB 78HPLUS1的地址,及DATA1的地址见图 X1注意DB、DW的不同WW112H23H12H00H23H00H例 X1
4、 DB 12H,23HWW1 DW 12H,23H 可用?表示仅保留存储空间而不指定初值ABC56*7 例 ABC DB 5,6,?,7 复制操作符 DUP (duplication) 例 ARRAY DB 3,4,2 DUP(0,1)340101ARRAY复制2次 变量赋初值时可用字符串例: STRING DB ABCDEDAT3 DB AB,7FH,CDB DEF41H42H43H44H45H41H42H7FH43H44H45H46HSTRING DAT3在DB语句中 字符串内个数任意;但在其它如DW或DD中最多只能2个例:DAT1 DW AB,C,DEDAT142H41H43H00H45
5、H44H45H23H DAT2 DW 2345H, ABC,EDDAT2注意DB与DW中字符串排列次序的不同(2) 2000H:0000H:0001H12H34H7FHPLUS1DATA1变量的属性1 段属性(SEG)例 PLUS1 DB 12H DATA1 DW 7F34H SEG(PLUS1)=2000H SEG(DATA1)=2000H2 偏移量属性(OFFSET) 例 OFFSET(PLUS1)=0000H OFFSET(DATA1)=0001H 3 类型属性 TYPE(PLUS1)=1 TYPE(DATA1)=23 标号标号为指令的符号地址,常作为转移指令的操作数。例: START:
6、MOVAX,DATMOV DS,AXJMPSTART标号也有段属性和偏移属性意义同变量属性但另外还有距离属性NEAR FAR三 表达式与运算符在宏汇编源程序中,操作数不一定要写得很明确,可以由若干操作数与运算符构成的表达式表示:例: ADD AL,27H ;明确表示 ADD AL,2+3 ;用表达式表示 但汇编后自动转为ADD AL,5 表达式中的运算符可以有6类:(见P162)(1) 算术运算符例:MOV AL,32 MOD 5;=MOV AL,2 ADD AL,21H SHL 2;=ADD AL,84H(2) 逻辑运算符例:MOVAL,24H AND 0FH ;=MOV AL,04H AN
7、D AL,10H OR 0FH ;=MOV AL,1FH(3) 另外还有关系运算符、分析运算符、组合运算符等。组合运算符中,定义符号名为新类型。PLUS1 类型PTR符号名12H34H例 PLUS1 DB 12H,34H MOV AL,PLUS1 ;(AL)=12H MOV AX,WORD PTR PLUS1; (AX)=3421H伪指令不由CPU执行,但由MASM识别的一些命令,分为14类。1 符号定义伪指令实际上是常量符号化的命令(类似于C语言中的define)例: RED EQU 10H GREEN EQU 11H BLUE EQU 12H WHITE EQU RED+GREEN+BLU
8、EMOV AL,RED ;=MOV AL,10H 注意:与变量定义不同的是,EQU语句定义的常量实际上是等值替换,且在程序中是不可更改的。2 内存数据定义伪指令前述的DB、DW、DD、DQ等3 段定义伪指令汇编程序(MASM)在把源程序转换成目的程序时,还必须的对内存进行正确划分,分配给不同的段。须用段定义伪指令。格式: 段名 SEGMENT ;段头 段名 ENDS ;段尾 段中间可以是数据段、代码段、附加段、堆栈段 选择项: (1)。定位方式 PAGE、PARA、WORD、BYTE 决定了段的起始地址方式 (2)。连接方式 PUBLIC、STACK、NONE、 COMMON、MEMORY、A
9、T (3)。类别名 自定义的一个符号,凡类别名相同的段以先后次序连接起来。 4段寄存器说明伪指令 ASSUME CS:PROG,DS:DAT,SS:STACKP 一旦定义好了段之后,ASSUME指令用来告诉汇 编程序(MASM)哪个段寄存器该指向哪个段。 除了程序段,MASM它不能把段的地址真正给段寄存器,还需在程序中编写把段的地址真正给段寄存器的程序。 例:MOV AX,DAT MOV DS,AX5, 过程定义伪指令在汇编语言中,子程序又称为过程用 PROC ;头 ENDP ;尾6模块开始和结束 开始: NAME 模块名 或 TITLE 模块名 汇编生成的OBJ文件需要名字,另外在LIST文
10、件中可以打印出标题。如无此命令,则以文件名为模块明。7定位伪指令*:1000H0803 格式: ORG 常数表达式 例: ORG 1000H DB 08H,03H注意:同一段中ORG必须从小到大,且不许重叠。 数据段、程序段均可用ORG定义起始地址 ORG 100H MOV AX,0308H MOV BX,AX ORG 101H MOV CX,AX ORG 100HMOV AX,0308H ORG 50HMOV BX ,AX 8$伪指令 (1)出现在指令中,表示当前指令地址。例:JNE $ ,JMP $+6 (2)出现在数据段中,$ 表示出现$的哪个单元地址。例:DATA SEGMENT*:0000H PLUS1 DB 12H,$,$+2,34H12H1434HDATA SEGMENT ARRAY DB 10H,20H,30H,40H COUNT EQU $ARRAY值$=4COUNT=4-0=4*:0000H10H20H30H40H
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1