《第5章-汇编语言与汇编程序设计》由会员分享,可在线阅读,更多相关《第5章-汇编语言与汇编程序设计(59页珍藏版)》请在金锄头文库上搜索。
1、范立南 张乐 主编 吴琼 王楠 杨红 副主编 清华大学出版社,微型计算机原理及应用 第5章 汇编语言与汇编程序设计,本章知识结构图,第5章 汇编语言与汇编程序设计,5.1 汇编语言概述 5.2 伪指令 5.3 宏指令 5.4 条件汇编 5.5 程序设计基本方法,5.1 汇编语言概述,汇编语言:一种面向机器的用符号表示的程序设计语言,这些符号称为助记符。 和机器语言不同的是,汇编语言用直观、便于记忆和理解的英文单词或缩写符号来表示指令和数据变量。 汇编指令集和伪指令集及其使用规则的统称就是汇编语言。,5.1 汇编语言概述,5.1.2 汇编程序功能及上机过程 汇编程序有各种类型,不同机型其汇编程序
2、也不相同。汇编程序一般都具有宏汇编的功能,支持地址和数据的符号表示,支持对内存的管理,支持程序的模块化组织,支持多种类型的数据表示等。 汇编程序的主要功能: (1)检查源程序; (2)测出源程序中的语法错误,并给出出错信息; (3)产生源程序的目标程序,并可给出列表文件; (4)展开宏指令。,汇编语言程序设计上机过程,5.1 汇编语言概述,5.1.3 汇编语言源程序的结构与格式 1结构与书写格式 汇编语言源程序通常由四部分组成:数据段、附加段、堆栈段和代码段。有时当不需要附加段时,也可采用三段结构。 数据段用来存放执行程序时需用的数据,一般至少需要一个数据段。堆栈段用来保存子程序调用或中断服务
3、程序返回地址及现场寄存器的值,此外,还可以临时保存一些工作寄存器和变量的值。代码段存放程序指令代码,实施程序预定的运算与操作。,5.1 汇编语言概述,2汇编语言语句格式 汇编语言语句一般格式: 标识符/语句标号 操作数序列; 注释 表示可选项。 (1)标识符: 标识符是程序设计人员自己定义的标识符号,简称标号。它可以是变量名,段名及过程名等,用来表示数据、数据在内存中的偏移地址及指令代码在内存中的偏移地址。,5.1 汇编语言概述, 合法的标识符(标号)的组成规则 组成标号的字符:AZ ,az ,09 ,? , ,$ , _ 标识符长度不限,但只有前31个字符有效。 标号的第一个字符不能是09的
4、数字。不能以数字开头。 机器指令语句中标号必须以冒号(:)结束。伪指令语句中标号后不允许有冒号。 点号.只能用作标识符的第一个字符。 源程序中大、小写字母等效。 汇编语言本身对机器指令的助记符号、伪指令助记符号和寄存器名字都已作了定义,称为保留字,在编程时所定义的标识符号通常称为自定义名字。注意:不要用保留字作为自定义名字,以免引起混淆。 标识符(标号)的属性 标识符(标号)具有3种属性:段、偏移量和类型。,5.1 汇编语言概述,(2)操作符 操作符可以是指令助记符、伪指令助记符和宏指令(宏名字)符号。无标号时操作符可以从一行的开始书写,有标号时则从标号后开始书写,标号与操作符之间以冒号、空格
5、或水平制表符分隔,操作符与操作数之间以空格或水平制表符分隔。如果操作符后无操作数或注释时,以行终止符(回车符)结束。,5.1 汇编语言概述,(3)操作数序列 操作数是操作符的操作对象,操作数可以是数据本身、标号、寄存器名字或算术表达式。随指令类型的不同而变化。 语句中有多个操作数时,彼此间用逗号分隔。 操作数后有注释时,以分号“ ; ”结束,无注释时以行终止符结束。,5.1 汇编语言概述,(4)“ ; ”注释符 注释是对程序段功能或语句在程序中的作用的说明,目的是在阅读、分析程序时,便于对程序各部分的逻辑关系有一个大致的了解。 提高程序的可读性和可理解性,便于程序的修改和维护。注释可由任意多个
6、字符组成。,5.1 汇编语言概述,5.1.4 常量、变量、运算符和表达式 1常量 常量是一个确定的数值,在程序运行期间不能改变。常量可以用作立即数、偏移量以及用于初始化存储器单元。 2变量 变量是在程序运行期间可以改变的量,变量名按标识符的规则取名。所有的变量都有三种属性: (1)段值:变量所在段的段首址。 (2)偏移量:从段首址到变量存储单元的字节数。 (3)类型:变量占用的存储器单元的字节数。,5.1 汇编语言概述,3运算符和表达式 表达式由操作数和运算符按语法规则组合而成。表达式的计算结果是一个确定的值,在汇编期间由汇编程序计算。表达式中的操作数可以是寄存器名、常量、标号或变量。,5.1
7、 汇编语言概述,(1)算术运算符 算术运算符完成、*、/和取模运算等。常用于数字操作数,得到数字运算结果,也可以用于地址操作数,但只能进行两种有意义的加、减运算,其他的运算则是无意义的。具体如下: 加法运算符() 减法运算符() 乘法运算符(*) 除法运算符(/) 取模运算符(MOD),5.1 汇编语言概述,(2)移位运算符 移位运算符有两个:SHR和SHL,分别对常数进行逻辑右移和逻辑左移。 (3)逻辑运算符 逻辑运算符AND、OR、XOR和NOT分别对常数进行按位逻辑与、逻辑或、异或和逻辑非运算。,5.1 汇编语言概述,(4)关系运算符 关系运算符用于比较两个表达式,表达式中的项必须是常数
8、或同一段内的变量。如果是常数则按无符号数比较,如果是变量则比较它们的偏移量。如果比较结果为真,关系表达式的值为0FFFFH,如果为假,关系表达式的值为0。 等于运算符(EQ) 不等于运算符(NE) 小于运算符(LT) 小于或等于运算符(LE) 大于运算符(GT) 大于或等于运算符(GE),5.1 汇编语言概述,(5)分析运算符 分析运算符有SEG、OFFSET、TYPE、LENGTH和SIZE。这些运算符用于分解存储器操作数(标号、变量)的各部分(段地址、偏移地址、类型等),并返回相应的值。 (6)属性修改运算符 这类运算符有PTR和THIS,用来改变存储器操作数的类型属性。 (7)记录专用算
9、符 记录专用算符有MASK、WIDTH。,5.1 汇编语言概述,(8)运算符的优先级 表达式中有多个运算符时,按优先级从高到低顺序运算,优先级相同的运算符则从左至右运算。任何情况都可以用圆括号改变运算顺序。,5.2 伪指令,5.2.1 伪指令的类型及其格式 1类型 (1)符号定义伪指令 (2)数据定义伪指令 (3)段定义伪指令 (4)过程定义伪指令 (5)其他伪指令 2伪指令的格式 格式:标识符 操作数1,操作数2;注释,5.2 伪指令,5.2.2 符号定义伪指令 符号定义伪指令用于给程序中多次出现的同一个常量或表达式赋予一符号名,该符号名可在程序中替代相应的常量和表达式。 1EQU(EQUA
10、TE)伪指令 2“= ”伪指令,5.2 伪指令,5.2.3 数据定义伪指令 数据定义伪指令用于为数据项分配存储单元,并给所分配的存储单元定义符号名(即定义符号地址),同时初始化该存储单元或由该单元开始的若干连续单元。初始化单元就是将一个值(确定的数值或不确定的值)放入指定的内存单元。常用的数据定义伪指令有DB、DW、DD、DQ和DT。 1DB伪指令 功能:DB伪指令初始化一个单字节存储单元。 2DW伪指令 功能:DW伪指令初始化一个单存储单元。,5.2 伪指令,3DD伪指令 4DQ伪指令 5DT伪指令 6复制操作符 在数据定义伪指令的操作数字段中,还可以使用复制操作符DUP,以便定义大量相同数
11、据。 复制操作符格式: DUP(初值1,初值n)。 表达式的值为一个正整数,用作重复计数,它指定括号中的初值重复定义次数。,5.2 伪指令,5.2.4 段定义伪指令 1SEGMENTENDS伪指令 格式: SEGMENT 【定位类型】【组合类型】【类别名】 ENDS (1)定位类型指定了装入某段时,该段对起始地址边界的要求; (2)组合类型组合类型指定段之间的连接关系为可选项; (3)类别名是一个标识符,必须用单引号括起来连接程序LINK将根据组合类型把类别名相同的段连接在一起。,5.2 伪指令,2ASSUME伪指令 当CPU要访问存储器中某段的存储单元时,必须先将指向该段的段寄存器提供的段地
12、址和该存储单元的偏移地址转换为物理地址。 ASSUME的作用是告诉汇编程序,把源程序转换为机器代码时,各段寄存器的符号地址,以确定和检查机器指令中操作数所在的段,产生正确的机器指令代码或打印出错误信息。 格式:ASSUME 段寄存器名:段名, 例如: ASSUME CS: CODE, DS: DATA, SS: STACK,5.2 伪指令,3ORG伪指令 代码定位伪指令。汇编程序使用了一个地址计数器,用来记录汇编过程中正被汇编指令的偏移地址。ORG伪指令可通过地址计数器提供程序定位功能。用来确定其后的数据和代码存放在相应段中的起始位置。 ORG伪指令格式: ORG 的值为一个无符号的十六位二进
13、制数,是相对于段基址的偏移量。 ORG伪指令把表达式的值赋给地址计数器,使得ORG之后的指令或数据以表达式的值为起始地址开始存放,除非遇到新的ORG伪指令。,5.2 伪指令,4过程定义伪指令 汇编语言程序的代码段由一个主过程和若干个子过程构成,子过程也称为子程序。利用过程定义伪指令可将程序按功能划分成模块,这样有利于理解、调试和修改程序。 格式:过程名 PROC NEAR/FAR RET 过程名 ENDP 伪指令PROC和ENDP必须成对出现,并且过程名要相同。5其他伪指令,5.3 宏指令,5.3.1 宏定义与宏调用语句 1宏定义 宏定义的形式如下: MACRO , 语句串 ENDM 2宏调用
14、语句 3宏展开,5.3 宏指令,5.3.2 宏调用中的参数替换 参数替换时规定如下: (1)宏定义的形式参数在语句中一定是一个语法单位,即形式参数的两端应有间隔符,间隔符可以是空格、逗号、括号以及运算符等符号。 (2)&可作为宏定义中虚设的间隔符,表示其后面的是形参,仅在宏定义中使用。在宏展开时,用相应实参替换。 (3)如果参数中包含间隔符,可用尖括号括起来,尖括号中的空格不被忽略。 (4)宏定义使用中,如果形参个数大于实参个数,则用空代替,反之忽略多余的实参。,5.3 宏指令,5.3.3 宏定义的标号、注释及删除 1宏定义中的标号 2宏定义中的注释 (1)宏注释符(2)行注释符(3)块注释
15、3从内存中删除宏定义 删除宏定义语句PURGE的使用形式为: PURGE , 宏定义名 说明:汇编时将该语句所指的宏定义从内存中删除。 5.3.4 宏的退出,5.4 条件汇编,条件汇编伪指令指示汇编程序根据条件检测选择汇编不同的程序段。 5.4.1 条件汇编语句 格式: IFX (程序段1) ELSE (程序段2) ENDIF,5.4 条件汇编,5.4.2 条件汇编伪操作命令的功能 (1)IF CONT (2)IFE CONT (3)IF1 (4)IF2 (5)IFDEF CONT (6)IFNDEF CONT (7)IFBCONT (9)IFIDNCHR1, CHR2 (10)IFDIFCH
16、R1, CHR2,5.4 条件汇编,5.4.3 条件汇编伪操作命令举例 1IFENDIF:当指定的表达式的值为真时,IF和ENDIF之间的汇编语句才会被汇编。 2IFELSEENDIF:若IF的表达式返回真,则在IF和ELSE之间的语句将被汇编。 3IFDEFENDIF:只有当指定的标号、变量或符号被定义时,IFDEFENDIF条件伪指令才汇编一组汇编语言语句。 4IFNDEFENDIF:只有当指定的标号、变量或符号不被定义时,IFNDEF ENDIF条件伪指令才汇编一组汇编语言语句。,5.5 程序设计基本方法,5.5.1 汇编语言程序设计 1汇编语言程序设计的基本步骤,图5-3 汇编语言程序设计的基本过程,5.5 程序设计基本方法,2流程图的应用, 流程线,指示程序处理的逻辑顺序。 端点框,表示程序的逻辑起点或终点。 判断框,表示一个判断点,在此产生分支,框内注明条件,判断结果标在出口的流程线上。 处理框,表示一种处理功能或者子程序段,框内用文字说明功能。 连接框,框内注有字母,表示程序的去向或来源。,