汇编语法及其程序格式
1.教学目的:掌握微型汇编语言格式和程序设计方法
2.教学要求:
熟悉汇编语言程序的结构、语句类型和格式。
熟悉数据项及表达式,要求能明确区分标号和变量。
熟悉各类伪指令,要求掌握常用伪指令格式和应用。
熟悉汇编语言上机过程和DEBUG调试
3.教学重点:
①指令语句格式和伪指令语句格式
②汇编语言程序格式。
4.掌握难点:
①伪指令
②伪指令存储器分配技术
5.教学进程安排:P102~133
6.教学方法:
课堂讲授
7.教学内容摘要:
4.1 汇编语言语句格式
4.1.1 语句种类
【例4-1】先给出一个完整的汇编语言源程序,该程序的功能是完成两个字节数据相加。
DATA SEGMENT ;段定义开始(DATA段)
BUF1 DB 34H ;第1个加数;
BUF2 DB 2AH ;第2个加数
SUM DB ? ;准备用来存放和数的单元
DATA ENDS ;段定义结束(DATA段)
CODE SEGMENT ;段定义开始(CODE段)
ASSUME CS:CODE,DS:DATA ;规定DATA、CODE分别为数据段和代码段
START: MOV AX, DATA
MOV DS, AX ;给数据段寄存器DS赋值
MOV AL, BUF1 ;取第1个加数
ADD AL, BUF2 ;和第2个加数相加
MOV SUM,AL ;存放结果
MOV AH, 4CH ;
INT 21H ;返回DOS状态
CODE ENDS ;段定义结束(CODE段)
END START ;整个源程序结束从上面这个例子可以看出,汇编语言源程序由若干个语句组成,语句分为如下2类。
1.指令语句
2.伪指令语句
4.1.2 语句格式指令语句和伪指令语句的格式是类似的,格式如下:
[名字] 操作码 操作数 [;注释]
1.名字
⑴名字的标识符
⑵名字的定义规则
⑶名字的2种主要形式
①标号
②变量
2.操作码
3.操作数
⑴常数
⑵表达式
①算术运算符
②逻辑运算符
③关系运算符
4.注释项
4.2 伪指令与伪操作
4.2.1 定义符号的伪指令
1,等值伪指令EQU
格式:<符号名> EQU <表达式>
2,等号伪指令 =
EMP=7
EMP=EMP+1
3,解除定义伪指令PURGE
格式:PURGE <符号1,符号2,…,符号N>
4.2.2 定义数据的伪指令
[变量] 助记符 操作数,…,操作数 [;注释]
功能:为操作数分配存储单元,并用变量与存储单元建立联系。
DB、DW、DD、DQ、DT
【例4-2】操作数可以是常数,或者是表达式
(根据该表达式可以求得一个常数),如
DATA_BYTE DB 10,4,10H
DATA_WORD DW 100,100H,-5 图4.1 例4-2的汇编结果
DATA_DW DD 3C,OFFFDH
汇编程序可以在汇编期间在存储器中存入数据,
汇编后的内存分布如图4.1所示。
【例4-3】操作数也可以是字符串,如:
MESSAGE DB ‘HELLO’
则存储器存储情况如图4.2⑴所示,而DB ‘AB’
和DW ‘AB’的存储情况则分别如图4.2⑵和⑶
所示。
【例4-4】操作数?可以保留存储空间,但不存入数据。
如:ABC DB 0,?,?,0
DEF DW ?,52,?
经汇编后的存储情况如图4.3所示。
图4.2 例4-3的汇编结果
【例4-5】 使用DUP实现重复定义
ARRAY1 DB 2 DUP(0,1,2,?)
ARRAY2 DB 100 DUP(? )
汇编后的存储情况如图4.4所示。
由图可见,例4-5中的第一个语句和语句ARRAY1 DB 0,1,2,?,0,1,2,?是等价的。
图4.3 例4-4的汇编结果 图4.4 例4-5的汇编结果
4.2.3 定义程序开始和结束的伪指令
NAME MODULE_NAME
TITLE TEXT
END [LABEL]
4.2.4 指令集选择伪指令
.8086 选择8086指令系统
.286 选择80286指令系统
.286P 选择保护方式下的80286指令系统
4.2.5 地址计数器与对准伪操作
1,地址计数器$
JNE $+6
【例4-6】$ 用法示例
ARRAY DW 1,2,$+4,3,4,$+4
如汇编时ARRAY分配的偏移地址为0074,则汇编后的存储区将如图4.5所示。
注意:ARRAY数组中的两个 $+4 得到的结果是不同的,这是 图4.5 例4-6的汇编结果
由于$的值是在不断变化的缘故。当在指令中用到$ 时,它只代表该指令的首地址,而与$本身所在的字节无关。
2,ORG伪操作
ORG伪操作用来设置当前地址计数器的值,其格式为:
ORG CONSTANT EXPRESSION
3,EVEN伪操作
4,ALIGN伪操作
ALIGN伪操作为保证双字类型数组边界从4的倍数开始创造了条件,其格式为:
ALIGN BOUNDARY
其中BOUNDARY必须是2的幂,例如:
.DATA

ALIGN 4
ARRAY DB 100 DUP(?)

就可保证ARRAY的值为4的倍数。当然,ALIGN 2和EVEN是等价的。
4.2.6 基数控制伪指令
.RADIX EXPRESSION
4.2.7 过程定义伪指令可把具有独立功能的程序段定义为过程,供其它程序调用。
过程定义的语法格式为:
<过程名> PROC NEAR/FAR

RET

<过程名> ENDP
4.3 汇编语言源程序结构
4.3.1完整段定义的程序结构
SEGMENT_NAME SEGMENT

SEGMENT_NAME ENDS
ASSUME <段寄存器名>:段名[,<段寄存器名>:段名,…]
ASSUME <段寄存器名>:NOTHING
<段名> SEGMENT [定位类型][组合类型][使用类型][类别]

<段名> ENDS
1,定位类型(ALIGN_TYPE)
PARA 指定段的起始地址必须从小段边界开始,即段起始地址最低位必须为0。这样,偏移地址可以从0开始。
BYTE 该段可以从任何地址开始。这样,起始偏移地址可能不是0。
WORD 该段必须从字的边界开始,即段起始地址必须为偶数。
DWORD 该段必须从双字边界开始,即段起始地址的最低位必须为4的倍数。
PAGE 该段必须从负的边界开始,即段起始地址的最低两个十六进制数位必须为0(该地址能被256整除)。
定位类型的默认项是PARA,即若未指定定位类型时,则汇编程序默认为PARA。
2,组合类型(COMBINE_TYPE)
组合类型的默认项是PRIVATE。
3,使用类型(USE_TYPE)
USE16 使用16位寻址方式。
USE32 使用32位寻址方式。
使用类型的默认项是USE16。
4,类别名(‘CLASS’)
在引号中给出连接时组成段组的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。
4.3.2 简化段定义的程序结构较新版本的汇编程序(MASM5.0与MASM6.0)除支持“完整的段定义伪操作”中所讨论的SEGMENT伪操作外,还提供了一种新的较简单的段定义方法。
1.MODEL伪操作
MODEL伪操作的格式如下:
.MODEL MEMORY_MODEL [,MODEL OPTIONS ]
2.简化的段定义伪操作
3.与简化段定义有关的预定义符号
4.用MODEL定义存储模型时的段默认属性
4.3.3 段组定义的程序结构其格式如下:
GRPNAME GROUP SEGNAME[,SEGNAME…]
其中GRPNAME为段组名,SEGNAME则为段名。
4.4 汇编语言程序的上机过程在计算机上运行汇编语言程序的步骤是:
1.用编辑程序建立ASM源文件;
2.用MASM程序把ASM文件转汇编成OBJ文件;
3.用LINK程序把OBJ文件转连接成EXE文件;
4.用DOS命令直接键入文件名就可执行该程序。

图4.7 汇编语言程序的建立及汇编过程
4.4.1建立汇编语言的工作环境为运行汇编语言程序至少要在磁盘上提供以下文件:
1.编辑程序,如EDIT.EXE
2.汇编程序,如MASM.EXE
3.连接程序,如LINK.EXE
4.调试程序,如DEBUG.COM
4.4.2 汇编语言源程序上机过程
1.建立汇编源程序ASM文件
2.汇编产生OBJ文件
3,链接产生EXE文件
4,程序的调试和执行
5,生成COM文件
4.5 动态调试程序DEBUG
4.5.1 DEBUG的启动与退出
1.DEBUG的启动
DEBUG[<文件说明>][<参数>]
2.退出DEBUG
格式 -Q↙
4.5.2 汇编、执行、跟踪与反汇编
1,A命令(汇编)
格式:A [<地址>]
2,G命令(执行)
格式:G[=<始址>][<断点地址>...]
3,T命令(跟踪执行)
格式:T[=<地址][<跟踪命令条数>]
4,U命令(反汇编)
格式:U[<地址>]
4.5.3 显示、修改内存和寄存器命令
1.D命令(显示内存)
格式:D[<地址>]或D[<范围>]
2,E命令(将内容写入内存)
格式:E[<地址>[<字节串>]]
3.R命令(修改寄存器)
格式:
R (显示所有寄存器和标志)
R寄存器 (显示指定寄存器)
RF (显示所有标志)
4.5.4 磁盘文件操作
1.N命令(命名)
格式:N<文件名>[<文件名>...]
2.W命令(写盘)
格式:W[<地址>[<盘号><相对扇区号><扇区个数>]]
3.L命令(读盘)
格式:L[<地址>[<盘号><相对扇区号><扇区数>]]
4.5.5 查找、比较、填充和移动内存命令
1,M命令(移动内存)
格式:M<源地址范围><目标地址>
2,C命令(比较)
格式:C<源地址范围><目标地址>
3,S命令(查找)
格式:S<地址范围><要查找的字节或字符串>
4,F命令(填充)
格式:F<地址范围><要填充的字节或字节串>
4.5.6 其他命令
1,H命令(十六进制运算)
格式: H 值1 值2
2,I命令(读端口信息)
格式为:I 端口地址
3,O命令(输出到端口)
格式:O<端口地址><字节内容>
8.参考资料:《IBM-PC汇编语言程序设计,沈美明
9.作业:P133 习题4
10.总结:该部分为汇编编程基础知识,需熟记和掌握。