宏汇编语言的基本语法7.docx
《宏汇编语言的基本语法7.docx》由会员分享,可在线阅读,更多相关《宏汇编语言的基本语法7.docx(13页珍藏版)》请在冰豆网上搜索。
宏汇编语言的基本语法7
★宏汇编语言的基本语法
一个完整的宏汇编语言源程序
(两个字节12H、34H相加):
DAT
SEGMENT
PLUS1
DB
12H
PLUS2
DB
34H
SUM
DB
?
DAT
ENDS
PROG
SEGMENT
MAIN
PROC
FAR
ASSUME
CS:
PROG,DS:
DAT
START:
PUSH
DS
XOR
AX,AX
PUSH
AX
MOV
AX,DAT
MOV
DS,AX
MOV
AL,PLUS1
ADD
AL,PLUS2
MOV
SUM,AL
RET
MAIN
ENDP
PROG
ENDS
END
START
汇编语言中的两种语句:
1.指令语句(例如MOVAX,DAT)
2.伪指令语句(例如DATSEGMENT;PLUS1DB12H等)
伪指令功能:
数据定义,分配存储区,程序分段,指示程序结束等
伪指令语句与机器指令语句的最大区别:
机器指令语句标号后有冒号“:
”
伪指令语句标号后无冒号“:
”
一.伪指令语句格式
〈标号名〉伪指令〈操作数1,2,3┉〉〈;注释〉
带〈〉者可省略
例:
DATSEGMENT
PLUS1DB12H,23H
二.常数、变量、标号
1.常数
在程序运行中不发生改变
(例:
立即数,变量的初值)
有几种表示法:
(1)二进制10100011B
(2)八进制176547O
(3)十六进制7FH,7DF6H
(4)十进制245D,36,76
(5)实数(浮点)
(6)字符串(例‘A’即为41H;‘AB’即为41H、42H)
2.变量
存放在存储器数据段内单元的数据,运行时可修改,也可赋初值。
在程序中是以变量名的形式出现(以直接寻址方式引用)
MOVAL,PLUS2=MOVAL,[0002H]
(1)变量定义及存储器分配伪指令
DB定义字节1字节
DW定义字2字节
DD定义双节4字节
DQ定义四节8字节
12H
23H
56H
78H
DT定义10字节10字节
2000H
:
0000H
:
0001H
PLUS1
DATA1
例:
PLUS1DB12H
DATA1DB23H,56H
DB78H
PLUS1的地址,及DATA1的地址见图
X1
注意①DB、DW的不同
WW1
12H
23H
12H
00H
23H
00H
例X1DB12H,23H
WW1DW12H,23H
②可用?
表示仅保留存储空间而不指定初值
ABC
5
6
**
7
例ABCDB5,6,?
,7
③复制操作符DUP(duplication)
例ARRAYDB3,4,2DUP(0,1)
3
4
0
1
0
1
ARRAY
复制2次
④变量赋初值时可用字符串
例:
STRINGDB‘ABCDE’
DAT3DB‘AB’,7FH,‘C’
DB‘DEF’
41H
42H
43H
44H
45H
41H
42H
7FH
43H
44H
45H
46H
STRING
DAT3
在DB语句中字符串内个数任意;
但在其它如DW或DD中最多只能2个
例:
DAT1DW‘AB’,‘C’,‘DE’
DAT1
42H
41H
43H
00H
45H
44H
45H
23H
DAT2DW2345H,‘ABC’,‘ED’
DAT2
注意DB与DW中字符串
排列次序的不同
(2)
2000H
:
0000H
:
0001H
12H
34H
7FH
PLUS1
DATA1
变量的属性
1段属性(SEG)
例PLUS1DB12H
DATA1DW7F34H
SEG(PLUS1)=2000H
SEG(DATA1)=2000H
2偏移量属性(OFFSET)
例OFFSET(PLUS1)=0000H
OFFSET(DATA1)=0001H
3类型属性
TYPE(PLUS1)=1TYPE(DATA1)=2
3.标号
标号为指令的符号地址,常作为转移指令的操作数。
例:
START:
MOV
AX,DAT
MOV
DS,AX
…
……
JMP
START
标号也有段属性和偏移属性意义同变量属性
但另外还有距离属性①NEAR②FAR
三.表达式与运算符
在宏汇编源程序中,操作数不一定要写得很明确,可以由若干操作数与运算符构成的表达式表示:
例:
ADDAL,27H;明确表示
ADDAL,2+3;用表达式表示
但汇编后自动转为ADDAL,5
表达式中的运算符可以有6类:
(见P162)
(1)算术运算符
例:
MOVAL,32MOD5;=MOVAL,2
ADDAL,21HSHL2;=ADDAL,84H
(2)逻辑运算符
例:
MOV AL,24HAND0FH;=MOVAL,04H
ANDAL,10HOR0FH;=MOVAL,1FH
(3)另外还有关系运算符、分析运算符、组合运算符等。
组合运算符中,定义符号名为新类型。
PLUS1
〈类型〉PTR〈符号名〉
12H
34H
例PLUS1DB12H,34H
MOVAL,PLUS1;(AL)=12H
MOVAX,WORDPTRPLUS1;(AX)=3421H
★伪指令
不由CPU执行,但由MASM识别的一些命令,分为14类。
1.符号定义伪指令
实际上是常量符号化的命令(类似于C语言中的define)
例:
REDEQU10H
GREENEQU11H
BLUEEQU12H
WHITEEQURED+GREEN+BLUE
MOVAL,RED;=MOVAL,10H
注意:
与变量定义不同的是,EQU语句定义的常量实际上是等值替换,且在程序中是不可更改的。
2.内存数据定义伪指令
前述的DB、DW、DD、DQ等
3.段定义伪指令
汇编程序(MASM)在把源程序转换成目的程序时,还必须的对内存进行正确划分,分配给不同的段。
须用段定义伪指令。
格式:
段名SEGMENT<选择项>;段头
┋
段名ENDS;段尾
段中间可以是数据段、代码段、附加段、堆栈段
选择项:
(1)。
定位方式
PAGE、PARA、WORD、BYTE
决定了段的起始地址方式
(2)。
连接方式
PUBLIC、STACK、NONE、
COMMON、MEMORY、AT
(3)。
‘类别名’
自定义的一个符号,凡类别名相同的段以先后次序连接起来。
4.段寄存器说明伪指令
ASSUMECS:
PROG,DS:
DAT,SS:
STACKP
一旦定义好了段之后,ASSUME指令用来告诉汇编程序(MASM)哪个段寄存器该指向哪个段。
除了程序段,MASM它不能把段的地址真正给段寄存器,还需在程序中编写把段的地址真正给段寄存器的程序。
例:
MOVAX,DAT
MOVDS,AX
5,过程定义伪指令
在汇编语言中,子程序又称为过程
用<过程名>PROC;头
┋
<过程名>ENDP;尾
6.模块开始和结束
开始:
NAME模块名
或TITLE模块名
汇编生成的OBJ文件需要名字,另外在LIST文件中可以打印出标题。
如无此命令,则以文件名为模块明。
7.定位伪指令
****:
1000H
08
03
格式:
ORG常数表达式
例:
ORG1000H
DB08H,03H
注意:
同一段中ORG必须从小到大,且不许重叠。
数据段、程序段均可用ORG定义起始地址
ORG100H
MOVAX,0308H
MOVBX,AX
ORG101H
MOVCX,AX
×
ORG100H
MOVAX,0308H
ORG50H
MOVBX,AX
×
8.$伪指令
(1)出现在指令中,表示当前指令地址。
例:
JNE$,JMP$+6
(2)出现在数据段中,$表示出现$的哪个单元地址。
例:
DATASEGMENT
****:
0000H
PLUS1DB12H,$,$+2,34H
12H
1
4
34H
DATASEGMENT
ARRAYDB10H,20H,30H,40H
COUNTEQU$—ARRAY值
$=4
COUNT=4-0=4
****:
0000H
10H
20H
30H
40H