第五章 汇编语言程序设计
作者:互联网
第五章 汇编语言程序设计
5.1 汇编语言程序基本格式
5.1.1 汇编语言源程序和汇编程序
汇编程序的主要功能是将汇编语言源程序转换为目标程序。
汇编后形成的目标程序必须经过连接程序,将库文件或其他目标文件连接到一起形成可执行文件止呕,才能送入计算机执行。如图所示:
5.1.2 汇编语言的特点
为什么还要使用汇编语言?
因为性能和对计算机的完全控制
汇编语言编写的程序具有以下特点:
- 执行速度快
- 程序短小
- 可以直接控制硬件
- 可以方便编译
- 辅助计算机工作者掌握计算机体系结构
5.1.3 一般汇编语言程序的结构形式
汇编语言程序采用分段结构,一般一个完整的源程序由3个程序段组成,即代码段、数据段、堆栈段。每一个段都已SEGMENT开始,以ENDS结束,整个源程序以END结束。如图所示:
每一段的语句体由语句序列组成,8086汇编语言语句分为如下三类。
- 指令语句: 8086指令系统的指令形式,与机器指令一一对应。
- 伪指令语句:又称管理语句。在汇编语言源程序的汇编过程中起作用,它是对汇编程序的命令语句,一般没有相应的目标代码。
- 宏指令语句:是宏汇编程序能识别的、预先定义的指令代码序列。一旦定义以后,宏指令就像一条指令一样,可以在源程序中被引用,其效果等同于引入一段代码序列。
每个语句最多由4个域组成,一般格式如下:
其中,标号(或名字)和注释是可选的,操作数或参数的有无及个数根据具体的指令或伪指令而异。
5.2 汇编语言中的数据
5.2.1 常量
常量是指在程序运行过程中不变的量。
- 数字常量: 可以是二进制数、八进制数、十进制数或十六进制数表示。
- 字符常量: 是用单引号‘ ’ 括起来的ASCII字符,其值是该字符的ASCII代码值。
- 符号常量: 是用标识符定义的常量。
5.2.2 变量
变量是存放在内存中某个存储区域中的数据,这些数据在程序运行期间随时可以修改。
- 变量的定义
定义变量就是给变量分配存储单元,并且给这个单元赋予一个变量名。
定义变量时使用数据定义伪指令来实现的。
(1)数据定义伪指令用来定义一个变量, 并将所需要的数据放入指定的存储单元中,也可以只给变量分配存储单元, 而不赋予特定的值。一般格式为:
常用的数据伪指令:
经过定义的变量有三个属性:数据类型、偏移量、段基址
(2)表达式时给变量预置的初值,可以是以下情况之一:
- 数值表达式:数值允许用二进制、 八进制、 十进制、 十六进制形式书写。
- ?:表示不预置确定的初值。
- 字符串表达式:用引号括起来的不超过255个字符或其他ASCII码符号。
- 带DUP操作符的表达式: DUP是定义重复数据操作符,它的使用格式是:
N DUP (Exp)
其中, N为重复次数, EXP为表达式。
- 变量的属性
经过定义的变量有三种属性:段属性、偏移属性、类型属性
-
- 段属性(SEGMENT):变量所在的段的起始地址(16位),此值必须在一个段寄存器中。
- 偏移属性(OFFSET):该变量与段的起始地址之间相距的字节数。
- 类型属性(TYPE):定义该变量的字节数。
- 变量的使用
- 变量名作为存储单元的直接地址:变量名用直接寻址时, 变量的类型必须与指令的要求相符合。
- 用合成运算符PTR可以临时改变变量类型。
- 变量名作为相对寻址中的偏移量。
- 变量名仅对应数据区第一个数据项。
5.2.3 标号
标号(Label)是某条指令所在内存单元地址的符号表示,经常在转移指令或子程序调用指令的地址码字段出现,用于表示转向的目标地址。
标号在代码段中定义,后面跟着冒号;它也可以用LABEL或EQU伪操作来定义,或者使用过程名来定义。
标号也具有3中属性:段属性、偏移属性、类型属性
- 段属性是定义标号在程序段的段地址。当程序中引用一个标号时,该标号的段值应在CS寄存器中。
- 偏移量属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。
- 类型属性有两种: NEAR和FAR。前一种标号可以在段内被引用,地址指针为2字节;后一种标号可以在其他段被引用,地址指针为4字节。
标号与变量是类似的,都是存储单元地址的符号表示。区别在于,标号对应的存储单元中存放的是指令;而变量所对应的存储单元存放的是数据。
在同一个程序中,同样的标号或变量的定义只允许出现一次,否则汇编程序出错。
5.3 运算符与表达式
8086汇编语言定义了多种类型的运算符,运算符与操作数组成表达式。表达式分为数值表达式和地址表达式。数值表达式的运算结果是一个数;地址表达式的运算结果是一个存储单元的地址。
- 算是运算符
算术运算符有+、-、*、/、MOD(取模)。
参加运算的内容可以是数据,也可以是地址,但在一个算术运算符的两边不能都是地址。
- 逻辑运算符包括: AND、 OR、 NOT、 XOR
- 关系运算符包括:
相等 : EQ ;大于: GT
不等: NE ;小于或等于: LE
小于: LT ;大于或等于: GE
关系运算符要有两个运算对象,两个运算运算对象要么都是数据,要么都是同一个段内的地址。关系运算的结果为数值,当关系成立时,结果为0FFFFH;当关系不成立时,结果为0000H
- 取值运算符
取值运算符可以从变量和标号中分析出它们的段地址、偏移地址、变量的类型、元素的个数和占用内存的大小等。8086中提供的取值运算符有SEG、OFFSET、TYPE、LENGTH、SIZE;其作用为:
- 合成运算符
合成运算符也称为修改属性运算符,它能修改变量或标号原有的类型属性,并赋予其新的类型。
- PTR运算符
PTR运算符可以改变存储器地址操作数的操作类型, 但其段地址和偏移地址不变。
格式:
类型 PTR 表达式
- THIS运算符
THIS运算符的功能与PTR运算符的功能相同,只是格式不同。THIS语句中建立一个新的符号名并指定它有THIS后的类型,而新符号名只想下一语句的原符号名的内存地址。
格式:
新符号名 EQU THIS 类型
原符号名 类型 参数,….
5.4 伪指令
伪指令:伪指令是用于诸如数据定义、存储区分配等功能。所谓伪指令是非机器指令,它是在汇编期间进行操作的。
1、符号定义伪指令
2、数据定义伪指令
3、端定义伪指令
4、过程定义伪指令(PROC\ENDP)
在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。
过程定义格式:
过程名PROC [NEAR] / FAR
…
…
RET ;过程体
过程名ENDP
调用一个过程的格式为:
CALL 过程名
5、TITLE伪指令
TITLE伪指令指定一个标题,以便能在列表文件每一页的第一行打印出这个标题,放置在程序的开始处。
格式:
TITLE 文本
其中,文本是用户给出的字符串,要求长度不超过6个字符
6、地址计数器与对准伪指令
7. 基数控制伪指令.RADIX
.RADIX伪指令可以把默认的基数改变为2-16的任何基数。
5.5 系统功能调用
为节省编程工作量与优化程序结构,在DOS及BIOS中预先设计好了一系列通用子程序,以便供DOS及BIOS调用。由于这种调用采用的是以中断指令INT n的内部中断方式进行的,所以常称为DOS及BIOS中断调用。
在一个中断服务程序中往往包含有多个功能相对独立的子程序,所以也将中断调用称为系统功能调用或功能调用或中断功能调用。
5.5.1 系统功能调用方法
1、格式:
INT n
其中,n是中断类型码。当n=5~1FH时,调用BIOS中的服务程序,称作系统中断调用;当n=20~3FH时,调用DOS中的服务程序,称作功能调用。
2、调用的方法如下:
①AH或AX←功能号;
②在其它寄存器中放入该功能所要求的入口参数;
③执行INT n指令。
5.5.2 BIOS调用
5.5.3 DOS系统功能调用
DOS功能调用:指DOS为系统程序员和用户提供的一组常用子程序。用中断指令INT 21H进入各功能调用子程序的总入口,再为每个功能调用规定一个功能号以便进入相应各子程序的入口。
带显示的单字符键盘输入 | 01H |
输出单字符 | 02H |
不带显示的单字符键盘输入 | 07H、08H |
字符串输出 | 09H |
字符串输入 | 0AH |
返回操作系统 | 4CH |
5.6 宏指令
宏定义是指用一个标识符(宏名)来代替一组指令序列(可同时包含指令性语句和指示性语句),宏功能的使用过程是:宏定义、宏调用、宏展开。
1、宏定义
宏指令定义格式:
宏指令名 MACRO <形参列表>
汇编程序段(宏体)
ENDM
2、宏调用
宏指令调用格式:
宏指令名 [实参列表]
3、宏展开
只在程序中宏调用时,汇编程序才把对应的宏指令体调出进行汇编处理。
标签:调用,定义,汇编语言,伪指令,运算符,第五章,指令,程序设计 来源: https://blog.csdn.net/weixin_44855366/article/details/114891514