导图社区 第四章汇编语言程序设计
新编16/32位微型计算机原理及应用(第5版):DB(定义字节): DB用于确定一定的数据项为字节,表示数据区的每个操作数占一-个字节。如果该数据区定义作为一个变量,则变量类型是BYTE。DB也常用来定义字符串。
编辑于2022-04-13 14:42:15第四章 汇编语言程序设计
程序设计语言
机器语言
定义:由二进制代码书写和存储的指令与数据
特点:能为机器直接识别与执行,程序所占内存空间较少
缺点:难认、难记、难编写、易出错
汇编语言
定义:用指令的助记符、符号地址、标号等书写程序的语言,简称符号语言
特点:易读、易写、易记
缺点:不能像机器语言那样为计算机直接识别,也不如高级语言那样具有很好的通用性和可移植性
高级语言
定义:脱离具体机器(即独立于机器)、面向用户的通用语言,不依赖于特定计算机的结构与指令系统
特点:简短、易读、易编写
缺点:编译程序或解释程序复杂,占用内存空间大,且产生的目标程序比较长,因而执行时间就长
8086/8088汇编语言的基本语法
汇编语言语句的种类和格式
语句的种类
指令语句
定义:是一种执行性语句,在汇编时,汇编程序将为其产生一一对应的机器目标代码
伪指令语句
定义:是一种说明性语句,在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号、分配存储单元、初始化存储器等
宏指令语句
定义:是以某个宏名字定义的一段指令序列,在汇编时,凡是有宏指令的位置都将用相应的指令序列的目标代码插入
语句的格式
指令语句的格式
格式: [标号:][前缀]指令助记符[操作数表][;注释]
标号
标号
是为指令性语句所在地址起的名字,用来作为程序转移的转向地址(目标地址)
属性
段地址:标号所在段的20为起始地址的前16位
段内偏移量(相对地址):标号与段起始地址之间相距的字节数,为一个16位无符号数
类型:表示该标号所表示的指令的转移范围,分NEAR(近)与FAR(远)两种
定义
定义:标号用标识符来定义,即以字母开头,由字母、数字、特殊字符(如?、下划线、@等)组成的字符串表示
长度
标号的最大的长度一般不超过31个字符,除宏指令名外,标号不能与保留字相同
使用
“标号”一般只在循环、转移和调用指令中使用,使用时应注意以下两点
(1)在循环或条件转移指令中,所用的标号的类型必须为NEAR,否则汇编将出错
(2)在无条件转移或调用指令中,使用标号时规定如下
①在段间使用时,应采用FAR类型;在段内使用时,采用NEAR类型较好,也可采用FAR类型
②对无条件转移指令中的NEAR类型标号。若定义标号与引用标号的两个指令距离离在-128~+ 127之间,则最好在标号前加一运算符SHORT,表示汇编时只要生成一个字节的偏移量,可省去一个字节的目标代码,称为“段内短转移”。而段内长转移的距离为-32768~+ 32767。
③段内或段间间接方式的CALL或JMP指令采用与普通存储器操作数相同的表示法
(3)循环和条件转移指令(LOOP或JX)的操作数在- 128~+127之间,被加到IP中以实现程序的相对转移
(4)JMP成CALL指令的转移方式及汇编表示见P115 表4.1
前缀:8086/8088中有些特殊指令常作为前缀同其他指令配合使用
指令助记符:包括8086/8088的指令助记符,以及用宏定义语句定义过的宏指令名
操作数表:对一般性执行指令来说,操作数表可以是一个或两个操作数,若是两个操作数,则称左边的操作数为目标操作数,右边为源操作数
操作数:8086/8088汇编语言中的操作数有三种形式
1)立即操作数
2)寄存器操作数
3)存储器操作数
(1)由指令直接给出,即直接寻址
(2)由寄存器的内容给出,即寄存器间接寻址
(3)由寄存器的内容及指令中的位移量相加后给出,即基址寻址
表达式:用运算符将常量、变量和标号这3个基本形式的数据连接起来的运算符
1)常量与数值表达式
(1)常量是指在汇编时已经有确定数值的量,它主要用作指令语句中的立即数、位移量DISP或在伪指令语句中用于给变量赋初值。
(2)常量分“数值常量”与“符号常量”两种
数值常量:以各种进位制数值形式表示的常量
符号常量:预先给常量定义一个“名字”,在汇编语句中用该“名字”表示该常量。它的定义需用伪伪指令EQU或“=”。
(3)数值表达式。一个能被计算并产生数值的表达式称为数值表达式。数值表达式可由常量、字符串常量以及代表常量或串常量的名字等以算术逻辑和关系运算符连接而成。
①算术运算符十、一、*、/、MOD、SHR SHL
②逻辑运算符AND、OR、XOR、NOT
③关系运算符EQ(或=)、NE(或≠)、LT(或<)、GT(或>)、LE(或<)、GE(或≥)
④分析运算符SEG、OFFSET、TYPE、SIZE、LENGTH、HIGH、LOW
⑤合成运算符PTR、THIS
2)变量与地址表达式
(1)变量及其属性
变量:是为数据区起的名字,它对应数据区的首地址,可以作为存储器操作数来引用。
属性:段属性、偏移值属性和类型属性。
(2)变量的定义
定义:使用伪指令DB、DW 、DD、DQ和DT来进行定义的,这些伪指令称为数据区定义伪指令
(3)变量的使用
变量是存储器数据区的符号表示。在使用变量作为存储器操作数时要注意以下几个问题
①在一条指令中必须明确是完成8位数据操作还是16位数据操作
②变量作为指令中的存储器操作数使用时,其段属性(段地址)与该指令使用的默认段寄存器内容必须相符,若不相符,则必须使用“跨段前缀”(或称段超越),否则指令无法从存储器中取得正确的操作数进行操作。
(4)地址表达式
①加法和减法运算符(+/-)
②方括号及寄存器BX,BP,SI,DI
③PTR运算符
④段超越运算符
注释:以“;”开始,用来简要说明该指令在程序中的作用,以提高程序的可读性
伪指令语句的格式
格式:[名字]伪指令助记符[参数表][;注释]
名字:可以是标识符定义的常量名、变量名、过程名、段名以及宏名等
标识符:由字母开头,由字母、数字、特殊字符(如?、下划线、@等)组成的字符串
参数表:包含有用逗号分割的多个参数,它们可以是常数、变量名、表达式等
伪指令语句
数据定义伪指令
1)常用的数据定义命令
(1) DB(定义字节): DB用于确定一定的数据项为字节,表示数据区的每个操作数占一-个字节。如果该数据区定义作为一个变量,则变量类型是BYTE。DB也常用来定义字符串
(2)DW(定义字):DW定义的数据项为字,它允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是WORD
(3)DD(定义双字):DD定义的数据项为双字,允许用地址表达式为数据项赋初值
(4) DQ(定义4字): DQ定义的数据项为4字,变最量类型为QBYTE
(5) DT(定义10字节): DT定义的数据项为10个字节,变量类型为TBYTED
2)存储器初始化
DB、DW、DD可用于初始化存储器。这些伪指令的右边有一表达式,表达式之值即该存储“单位”的初值。一个存储单位可以是字节、字、双字。
符号定义伪指令
1) EQU(赋值伪指令)
格式:名字EQU表达式
含义:EQU伪指令给表达式赋予一个名字,其后指令中凡需用到该表达式的地方均可以用此名字来代替。其中,“名字”为任何有效的标识符;“表达式”为任何有效形式的操作数,可求出常数值的表达式,甚至可定义为任何有效的助记符。
2)=(等号伪指令) 与EQU基本类似,起赋值作用
3)LABEL(类型定义伪指令) 不仅给名字(标号或变量)定义一个类型属性,而且隐含有给名字定义段属性和段内偏移量属性
段定义伪指令
1) SEGMENT和ENDS伪指令
解释:其中,SEGMENT与ENDS必须成对出现,SEGMENT与ENDS之间为段体,给其赋予一个名字,名字由用户指定是不可省略的,而定位类型、组合类型和类别是可选的。
定位类型
①BYTE:字节型
②WORD:字型
③PARA:节型
④PAGE:页型
组合类型
①NONE:表示该段与其他段在逻辑上不发生联系
②PUBLIC:表示该段与其他段中用PUBLIC说明的同名同类型的段连接成一个逻辑段,运算时装入同一物理段中,使用同一段地址
③STACK:连接时,将具有STACK类型的同名段连接成一个大的堆栈,运行时,SS和SP指向堆栈堆的开始位置
④COMMON:表示该段与其他模块中有COMMON说明的所有同名同类别的其他段连接时被重叠地放在一起
⑤MEMORY:表示由MEMORY说明的段在连接时被放在所有段的最后
⑥AT表达式:表达式的值即该段的段地址,连接程序将把该段装在由此段地址所指定的存储区内
2) ASSUME伪指令
作用:ASSUME是段定义伪指令,它用来定义源程序中的各个逻辑段,告诉汇编程序已定义的段地址将要放到哪个对应的段寄存器中
3) ORG伪指令
表达式:ORG表达式
作用:汇编程序把语句中表达式的值作为起始地址,连续存放程序和数据,直到出现一个新的ORG指令。若省略ORG,则从本段起始地址开始连续存放。
4.过程定义伪指令
1)过程:“过程”也称为“子程序”,它是具有某种功能的程序块,可以在程序中任何需要的地方调用它。控制从主程序转移到“过程”,称为“调用”;“过程”执行结束再返回主程序。在汇编语言中,用CALL指令来调用过程,用RET指令结束过程并返回CALL指令的后续指令
(1)外部过程:当调用该过程的主程序与该过程不在一个源程序文件中时,该过程应定义成外部过程
(2)内部过程:当调用该过程的主程序与该过程在同一个源程序文件中时,该过程叫做内部过程
①段内过程:调用该过程的主程序与该过程同在一个段中,这时也叫近过程,即NEAR属性的过程,它只能由属于定义该过程的段中的其他程序调用
②段外过程:调用该过程的主程序与该过程不在同一个段内,这时也叫远过程,即FAR属性的过程,它可以由任何段中的程序调用
2)过程定义伪指令格式 其格式为: 类型可选作NEAR或FAR.如果类型省略,则系统取NEAR类型。
格式: 过程名PROC [类型] ;指令序列 过程名ENDP
类型:可选作NEAR或FAR
3)调用过程:调用过程用“CALL过程名”来实现。
4)过程返回:长源通常子程序中包括十至多条返回指令,即当过程运行到某种条件满足时返回至主程序中,调用指令的下一条指令继续执行。返回指令有两种,即RET与RETn
8086/8088汇编语言程序设计基本方法
顺序结构程序
分支结构程序
循环结构程序
DOS及BIOS中断调用