04汇编语言程序设计_第1页
04汇编语言程序设计_第2页
04汇编语言程序设计_第3页
04汇编语言程序设计_第4页
04汇编语言程序设计_第5页
已阅读5页,还剩138页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理与接口技术第4章 汇编语言程序设计 4.1 汇编语言概述华中科技大学出版社 汇编语言(Assembly Language)是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。 用汇编语言编写的程序能够直接对位、字节、寄存器、存储单元、I/O接口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快。所以计算机高级技术人员大量使用汇编语言来编写计算机系统程序,实时通信程序和实时控制程序等。华中科技大学出版社 用

2、汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。8086系统中常用的汇编程序是标准汇编程序(ASM)和宏汇编程序(MASM),因此除了指令系统外,还要了解(MASM)中的标号、表达式、伪指令,必须按MASM中规定的格式来编写源程序,才能正确汇编成可执行程序。4.1.1汇编语言调试准备用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。 8086系统中常用的汇编程序是小汇编程序ASM或宏汇编程序MASM,因此除了指令系统

3、外,还要了解MASM中的标号、表达式、伪指令,必须按MASM中规定的格式来编写源程序 软件准备主要包括以下几类:(1)MS-DOS操作系统,如:MSDOS6.22,MSDOS7.0等。(2)文本编辑器,如:EDIT,TC等。(3)汇编程序,如:MASM等。(4)连接程序,如LINK。(5)调试程序,如:DEBUG、TDEBUG等)。 4.1.1汇编语言调试过程4.2 汇编语言8086宏汇编源程序是由8086CPU规定的“指令”和宏汇编程序规定的“伪指令”共同构成的。下面先看一个完整的用汇编语言编写程序。【例4.1】通过键盘向系统输入一个小写字符,然后将该字符转换成大写并显示出来。DATASEG

4、MENT;数据段BUFDB?DATAENDSSTACKSEGMNETST1DB 100DUP(?)CODESEGMENT;代码段ASSUME CS:CODE, DS:DATA, SS:STACKSTARTPROCFAR华中科技大学出版社BEGIN:PUSHDS;正常返回所需段地址及偏移地址MOVAX,0PUSHAXMOVAX,DATA;送数据段段地址MOVDS,AXMOVAX,STACK;送堆栈段地址MOVSS,AXLEA DX,BUF;送缓冲区首地址MOVAH,1;01号键盘输入功能调用INT21H;调用DOS中断服务,读入字符SUBAL,32MOVDL,AL;将需要显示的字符送DLMOVA

5、H,2;2号显示功能调用INT21H;调用DOS中断服务,输出字符RETSTARTENDPCODEENDSENDBEGIN从例4.1不难看到,因为8086系统的存储器采用分段管理,所以其汇编源程序也是由用户根据需要划分成“段”,汇编程序为此提供了专门的伪指令(SEGMENT和ENDS)来实现逻辑段的划分。实际上,一个完整的8086汇编语言源程序就是由一个或多个段组成的,段之间用段名加以区分,每个段中包括数目不等的语句行,各行语句均由各种符号(标记)及分隔符按照一定的规则组织起来。 华中科技大学出版社其一般结构如下: 段名1 SEGMENT;一个段的开始 语句1 语句2 段名1 ENDS;一个段

6、的结束 段名2 SEGMENT;另一个段的开始 段名2 ENDS;另一个段的结束 ;其他段 END ;源代码结束4.2.1 段华中科技大学出版社数据段用来在内存中建立一个适当容量的工作区,以存放常数、变量等操作数据。堆栈段用来在内存中建立一个适当的堆栈区,以便在中断、子程序调用时使用。代码段包括了许多以符号表示的指令,其内容就是程序要执行的指令。必不可少的是代码段和堆栈段,堆栈段也可以不用显示定义,可以直接使用隐式堆栈段,如果程序中需要使用数据存储区,则要定义数据段,必要时还要定义附加段。通常需要一个代码段、一个数据段和一个堆栈段,有时可包含一个附加段。而对于复杂的程序,除了使用上述3个段以外

7、还可以使用多个段,甚至可以使用多个程序模块。 华中科技大学出版社4.2.2 语句 语句是汇编语言源程序的基本组成单位。一个汇编语言源程序中有3种基本语句:指令性语句(指令)、指示性语句(伪指令)和宏指令。前两种是最常见、最基本的语句。指令语句和伪指令语句不仅在程序中的功能不同,而且实现其功能的方法和时间也不同。华中科技大学出版社1. 指令性语句(指令) 指令性语句与机器指令相对应,汇编程序可将它翻译成目标代码(机器指令代码),所以这种语句又称为可执行语句。语句格式为标号: 指令助记符操作数;注释 标号表示本指令语句的符号地址,标号后面必须紧跟 “:”。标号可使用的字符为字母(AZ,az)、数字

8、(09)或某些特殊字符(、_、?)等。第一个字符必须为字母或某些特殊字符,最大有效字符长度为31个字符。华中科技大学出版社 指令助记符是该语句的指令名称的代表符号,汇编程序将其翻译成机器命令。 操作数表示参加指令运算的数据,根据指令要求可以有一个或多个操作数,有的指令不需要操作数,多个操作数之间应用逗号隔开,操作数与指令助记符之间用空格隔开。操作数可以是常数、变量、标号、寄存器名或表达式。 注释用来说明一条指令或一段程序的功能。注释前必须加上 “;”。华中科技大学出版社2. 指示性语句(伪指令) 伪指令语句没有对应的机器指令,只为汇编提供所需信息,汇编程序汇编源程序时对伪指令进行处理,它可以完

9、成数据定义,存储区分配,段分配,指示程序结束等功能。其一般格式如下:名字 伪指令助记符 操作数 ;注释 名字是给伪指令取的名称,它用符号地址表示,名字后不允许带冒号,名字可以省略。伪指令中的名字通常是变量名、段名、过程名、符号名等。华中科技大学出版社 伪指令助记符是汇编程序MASM汇编规定的符号,常用的有变量定义语句(DB、DW),符号定义语句(EQU、=),段定义语句(SEGMENTENDS)等类型。 操作数是由伪指令具体要求的,有的伪指令不允许带操作数,有的要求带多个操作数,多个操作数之间必须用逗号分开。操作数可以是常数、变量、字符串、表达式等。 伪指令语句的注释也是可选项,需要时必须以“

10、;”开始。华中科技大学出版社3. 宏指令宏指令是一种特殊的伪指令,实际上是用一条伪指令代替多条指令,以简化程序的书写。其组成形式同指示性语句。带有宏指令的汇编源程序只能用宏汇编程序进行汇编。华中科技大学出版社4.3.1 字符集1英文字母:包括大写字母AZ和小写字母az。宏汇编语言中的大小写字母不予区分。2阿拉伯数字:09。3特殊符号:包括可打印字符和不可打印字符。其中:可打印字符包括:+ - * / = _ ( ) ; : , ? , $ & # 。不可打印字符包括空格符、制表符(Tab键)、回车符、换行符。4.3 8086汇编语言的基本语法华中科技大学出版社4.3.2 常量宏汇编语言中允许使

11、用以下两种类型的常量:1数字常量(1)二进制数:以“B”结尾,如00001101B;(2)八进制数:以“O”结尾,如725O;(3)十六进制数:以“H”结尾,若最高位为字母 AF,前面应加0,如0A12H;(4)十进制数:以“D”结尾或无任何字母作结尾,如10D、10。华中科技大学出版社2字符串常量字符串常量表示为包含在两个单引号之间的一连串ASCII码字符。当单引号本身作为一个串元素时,需连写两个单引号。每个串元素的值定义为该元素所对应的1字节ASCII码值。华中科技大学出版社4.3.3保留字8086宏汇编源程序可以使用以下几类保留字:(1)8086CPU规定的所有指令助记符:如MOV、AD

12、D等。(2)8086CPU中各寄存器名(包括16位和8位寄存器):如AL、AH、AX、DS、ES、SS等。(3)宏汇编程序规定的所有伪指令助记符:如ASSUME、END、ENDM、SEGMENT等。(4)宏汇编程序规定的其他助记符(包括各种运算符及伪指令参数):如AT、BYTE、COMMON、DUP、EQ、FAR、SEG、SHORT、等。华中科技大学出版社4.3.4 标识符用户定义的、具有特殊意义的字符序列。常用标识符包括变量名、标号、段名、过程名等。1变量名变量名具有以下3个属性:(1)段基址:该内存单元所在段的首址,为该段所对应的段寄存器值。(2)偏移量:该内存单元在段内相对于首址的距离,

13、为16位二进制数。(3)类型:该内存单元所存放的数据长度,可能是字节(BYTE)、字(WORD)等类型。华中科技大学出版社2标号用户为程序中某条指令所起的名字。标号也有3个属性:(1)段基址:标号所在代码段的首址,即CS值。(2)偏移量:标号所代表的指令相对于代码段首址的距离,为16位二进制数。(3)类型:有远(FAR)、近(NEAR)两种,分别区别标号所代表的指令与使用该标号做目标地址的控制转移指令是否位于同一代码段中若是,则为NEAR类型,否则为FAR类型。华中科技大学出版社3段名用户为程序中某个段所起的名字,等于该段的段基址。4过程名用户为程序中某个过程(子程序)所起的名字,等于该过程的

14、入口地址,即该过程第一条指令所对应的目标代码的存放地址。过程名具有标号所有的3个属性。华中科技大学出版社4.3.5 表达式表达式由运算对象及运算符组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句中的操作数去使用。表达式中的运算符包括算术运算符、逻辑运算符、关系运算符、分析运算符以及合成运算符五种。表4.1和表4.2给出了各类运算符以及其优先级别。华中科技大学出版社算术运算符逻辑运算符关系运算符分析运算符合成运算符加+与AND相等EQ取段基址SEGPTR减-或OR不等NE取偏移量OFFSETTHIS乘*非NOT大于GT取类型TYPESHORT除异或XOR小于LT取字节个数SIZE取余M

15、OD不小于GE取元素个数LENGTH左移SHL不大于LE取高字节HIGH右移SHR取低字节LOW表4.1 8086宏汇编语言支持的常用运算符华中科技大学出版社优先级运 算 符高低( )SIZE、 LENGTHPTR、 THIS、 SEG、 OFFSET、 TYPE*、MOD、SHL、SHR、 EQ、 NE、 GT、 LT、 GE、 LENOTANDOR、XOR表4.2 常用运算符的优先级别华中科技大学出版社1) 算术运算符 算术运算符包括+(加)、(减)、*(乘)、/(除,只取除法运算结果之商)、MOD(模,只取除法运算结果之余)、SHL(左移,左移1位相当于乘2)、SHR(右移,右移1位相当

16、于除2),因此19/7是2(商是2),而19MOD7是5(余数是5)。 所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数。当算术运算符应用于存储器即地址操作数时其规则就更加严格:只有当结果具有明确的、有意义的物理解释时,这些运算才是有效的。若对地址运算,通常是在标号上加/减某一个数字量,例DA1+2、K23各表示一个存储单元的地址,对地址乘是没有意义的。华中科技大学出版社【例4.2】 MOV AX,3*10+8 MOV AL,5MOD3 MOV BH,0001010lBSHL2 汇编后得到 MOV AX,38 MOV AL,2 MOV BH,01010100B华中科技大学出版社

17、【例4.3】 DAT1 DB 1 ;定义字节变量,并相应赋初值 DAT2 DB 3 DAT3 DB 20 MOV AL,DAT1 ADD AL,2 ;“ADD将在程序运行时进 ;行,结果(AL)123 MOV AL,DAT1+2 ;“”将在汇编时进行,这时还没有真正分配内存空间,各变量的值也并未存放好,指令的实际意义是:将DAT1单元后的第二个单元的值(即DAT3的值)送到AL中,程序运行后(AL)=20。华中科技大学出版社2) 逻辑运算符 逻辑运算符包括AND(与)、OR(或)、NOT(非)、XOR(异或)4种,逻辑运算符是按位运算的,只能对常数进行运算,得到结果也是常数。 逻辑运算符与80

18、86指令系统中的指令助记符AND、OR、NOT、XOR的符号完全相同,但二者是不会混淆的。作为MASM的运算符是在汇编过程中进行计算的,而指令助记符是在程序执行时进行运算的。华中科技大学出版社【例4.4】 AND BL,46H AND 0FH MOV AL,NOT 01H汇编后得到AND BL,06HMOV AL,0FEH华中科技大学出版社3) 关系运算符 关系运算符包括EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)6种。 关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值,若结果为真,输

19、出全是“1”,即0FFH或0FFFFH。若结果为假,输出全是“0”。关系运算符一般与逻辑运算符组合起来使用。华中科技大学出版社【例4.5】MOV AX,0A2H NE 02H MOV AL,02H GT 0A2H 汇编后得到MOV AX,0FFFFHMOV AL,00H华中科技大学出版社4) 分析运算符 分析运算符也经常称作数值返回运算符(analytic operators),包括OFFSET、TYPE、LENGTH、SIZE等,它们加在变量或标号前,返回运算对象的某个参数值,例如偏移地址值、段地址值、类型属性、变量包含的单元数等。(1) OFFSET。 格式:OFFSET 变量或标号 OF

20、FSET返回标号或变量的偏移地址值,为程序设计中常用的运算符。华中科技大学出版社(2) SEG。格式:SEG 变量或标号SEG用来取变量或标号的段基址。(3) TYPE。 格式:TYPE 变量或标号 TYPE加在变量前,返回变量的类型属性,TYPE加在标号前,返回标号的距离属性。(4) LENGTH。 格式:LENGTH 变量 当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其他变量则返回1。华中科技大学出版社(5) SIZE。 格式:SIZE 变量 SIZE 运算符加在变量前,返回该变量包含的总字节数。 比较SIZE、LENGTH和TYPE运算符的定义,可知有:SIZE 变量(

21、LENGTH 变量)*(TYPE 变量)华中科技大学出版社【例4.6】如有数据段定义如下:DSEG SEGMENT BUFF DW 10DUP(1234H),10H,00H COUN DD 12345678HDSEG EDNS则:SEG BUFF=DSEG SEG COUN=DSEG ;取段基址OFFSET BUFF0000H OFFSET COUN=0018H ; 取偏移量TYPE BUFF2(字) TYPE COUN4(双字) ; 取类型LENGTH BUFF10 LENGTH COUN=1 ;取DUP次数SIZE BUFF=2*10:20 SIZE COUN=4*1=4 ; 取字节数华中

22、科技大学出版社5) 合成运算符 合成运算符对已定义的单个操作数重新生成段基址、偏移量相同而类型不同的新操作数。PTR、THIS运算符对变量、标号有效,SHORT运算符仅对标号有效。(1) PTR。 格式:新类型 PTR 原操作数 该表达式代表的新操作数的段基址和偏移量与“原操作数”相同,新操作数的类型为表达式中指定的“新类型”。华中科技大学出版社【例4.7】 DAT1 DB 1 ;定义字节型变量 DAT2 DB 3 MOV AL,DAT1 ;执行后(AL)01H MOV AX,WORD PTR DAT1 ;执行后(AX)=0301H华中科技大学出版社(2) THIS。 格式:变量/标号 EQU

23、 THIS 新类型 THIS的功能是将EQU THIS右边的类型/距离属性,赋给左边的变量。标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。【例4.8】 FIRST EQU THIS BYTE TABLE DW 200 DUP(?) FIRST的偏移地址值与TABLE的偏移地址相同,区别在于FIRST变量为字节类型,TABLE为字类型。华中科技大学出版社(3) SHORT。 格式:SHORT 标号 SHORT用来说明转移类指令中转向地址的属性,指出转向的目标地址与本指令之间的距离在128+127之间,即限制在短转移范围内。【例4.9】 L1: JMP SHORT L2 L2:

24、MOV AX,0 如前所述,一个汇编语言的源程序是由一条条语句组成的,语句(statements)就是完成一个何种动作的说明。源程序中的语句可分成两类:指令语句和伪指令语句,其中指令语句为8086微处理器的各种符号指令,汇编程序把它们翻译成机器代码,这些代码命令8086执行某些操作。如MOV、ADD、JMP等。伪指令语句使用的是各种伪操作命令,汇编程序并不把它们(也不可能)翻译成机器代码,只是用来指示、引导汇编程序在汇编时进行一些操作,如定义符号、分配存储单元、初始化存储器等等,所以伪指令本身不占用存储单元。4.4 伪操作指令华中科技大学出版社伪指令语句的格式为名称 伪指令 操作数;注释 其中

25、,名称字段对于某些伪指令是必需的,对于另外一些伪指令是可选择的,还有一些伪指令则不允许有名称。操作数字段可以是一项或多项,项与项之间用逗号分开。注释是任选的,用于提高程序的可读性。 名称是该伪指令的标识符,当伪指令是数据定义伪指令时,名称为变量。指令中的名称和伪指令之间用空格符作为分隔,并且名称与指令的地址毫无关系。华中科技大学出版社在IBM宏汇编中有以下几种伪指令语句(Directive Statements): (1) 数据定义伪指令;(2) 符号定义伪指令;(3) 段定义伪指令;(4) 过程定义伪指令;(5) 宏处理伪指令;(6) 其他伪指令。这一类伪指令帮助用户灵活简洁地使用汇编语言编

26、程。华中科技大学出版社4.4.1 数据定义伪操作 数据定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值,其形式为变量名 变量定义符 操作数,操作数 ;注释 变量名是一个符号地址,表示其后操作数的首地址,多个操作数构成一个数组。变量名是程序员给出的标识符,为可选项,给出变量名只是为了按名存取其对应的内存单元。 华中科技大学出版社变量定义符主要包括下列几种。 (1) DB(Define Byte):定义字节,后面的每个操作数占1个字节。 (2) DW(Define Word):定义字,后面的每个操作数占1个字。 (3) DD(Define DWord):定义双字,后面的每个操作数占2个

27、字。 (4) DQ(Define QWord):定义四字,后面的每个操作数占4个字。 (5) DT(Define TByte):定义十字节,后面的每个操作数占10个字节。华中科技大学出版社操作数可以为:(1) 数值表达式;(2) ASC码字符串;(3) 地址表达式;(4) ?(只保存内存空间,未定义初始值);(5) DUP 子句,其格式为:重复次数 DUP (操作数,操作数),DUP子句可以嵌套。注释项用来说明伪指令的功能,是任选项。 下面用例题说明伪指令的用法。华中科技大学出版社图4.2 例4.10 数据存储格式华中科技大学出版社1. 操作数为常量或数值表达式【例4.10】 DB/DW/DD

28、/DQ的用法。 下列数据段定义和分配了一些存储单元,其实际分配图如图4.2所示。DA1DB 10H,52H;定义2个字节DA2DW 1122H,34H;定义2个字DA3DD 5*20H,0FFEEH;定义1个双字 2. 操作数为字符串【例4.11】 ST DB ABCDE DB伪指令也可用来定义一个字符串,此语句的含义是把字符串ABCDE中的每个字符的ASCII码依次存入以变量ST的地址开始的连续字节单元中。华中科技大学出版社3. 操作数为“?” 问号操作数表示预留存储单元,但不预置具体的数值,以便存放运算结果。【例4.12】 M1 DB ? ;定义变量 M1为不确定字节,保留一字节空间M2

29、DB 0D55H,?;定义变量M2第二个字为不确定字,保留2个字节空间4. 操作数用DUP来定义重复变量 重复操作符DUP可作为操作数的组成部分,其使用格式为变量名 DB/DW/DD/DQ/DT DUP(表达式) 华中科技大学出版社其中,DUP左边的表达式表示重复的次数,右边括号中的表达式表示要重复的内容,括号中的表达式可以是一个“?”,表示不置初值,为随机值;也可以是一个数据表达式,将相应单元初始化。【例4.13】 下面的数据段表示了DUP的用法, DB 100 DUP(0) DW 2 DUP(3 DUP (0,1) 第一条语句定义了100个字节,初值均为0;第二条语句相当于“DW 0,1,

30、0,1,0,1,0,1,0,1,0,1”,即定义了12个字单元,其初值为0、1、0、1、0、1。华中科技大学出版社5. 操作数为地址表达式 DW伪指令用于预置该地址表达式的偏移地址,DD伪指令则用于预置该地址表达式的偏移地址和段基址。【例4.14】 若ARRAY为变量名,AGAIN为标号名,则语句 ADDRN DW ARRAY+2表示将ARRAY+2单元的偏移地址存入ADDRN这个字类型变量中。而语句 ADDRF DD AGAIN则表示将标号AGAIN的段基址和偏移地址存入ADDRF这个双字类型变量中。其中,低字单元为偏移地址,高字单元中为段基址。华中科技大学出版社4.4.2 符号定义伪操作

31、符号定义伪指令用于为程序中多次出现的同一个常量或表达式定义为一个标识符,以便在源程序中以标识符来代替对应的常量或表达式。符号定义伪指令有以下3种。1. 等价伪指令EQU 格式:符号名 EQU 表达式 功能:为常量或表达式及其他各种符号定义一个等价的符号名,但它不申请分配存储单元。指令说明如下: (1) 表达式可以是常量或数值表达式;地址表达式;变量、标号或指令助记符。 (2) 符号名不占存储单元,没有段、偏移和类型这3种属性。 华中科技大学出版社(3) 在同一源程序中,使用EQU定义的符号不能与本程序中的其他符号名同名;另外,同一符号不能用EQU伪指令重新定义。EQU伪指令主要有以下3方面应用

32、: (1) 定义符号常量。用符号名表示常量、数值表达式。 (2) EQU与属性运算符PTR或THIS连用,可以给变量或标号定义新的类型属性并重新命名。但其段属性和偏移属性不变。 (3) 利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。华中科技大学出版社2. 等号伪指令“=” 格式:符号名 = 表达式 功能:该语句的功能与EQU语句类似,不同的是等号伪指令能对所定义的符号名多次重新定义,且以最后一次定义的值为准。 【例4.15】CN EQU100 ;符号CN等价为100CN1 EQU CN+100;符号CN1等价为表达式C

33、N+100C EQU CX ;符号C等价为寄存器名CXM EQU MOV ;MOV助记符可以由M代替B EQU DS:BP+20;地址表达式DS:BP+20可由符 ;号B代替华中科技大学出版社有了以上定义后,下列语句有效。M C,CN ;等效为MOV CX,100M BX,B ;等效为MOV BX,DS:BP+20 由EQU定义的符号,在整个程序中不可以被再次定义。而对于需要在程序中各处不断改变其意义的符号,应用“=”伪指令定义。【例4.16】 例如:CN EQU 100CN EQU 200第二个对CN的定义是错误的,但是CN = 100CN =200则以第二次对CN的定义为准,CN与200等

34、价。华中科技大学出版社3. 定义伪指令LABEL 格式:变量名或标号名 LABEL 类型 功能:LABEL伪指令用来在某一变量或标号的基础上定义一个新的类型不同的变量或标号。其中变量的类型可用BYTE、WORD和DWORD;标号的类型有NEAR和FAR。例如:VAR1 LABELWORDVAR2DB 20 DUP(1) 变量VAR1与VAR2具有相同的段基址和偏移量,但VAR2是字节型。L1LABEL FARL2:MOV AX,1000H 标号L1以及L2均为指令MOV AX,1000H的符号地址,但L1具有FAR类型,L2却是NEAR类型的。 从以上用法可知,LABEL伪指令与前述的综合运算

35、PTR和THIS功能相似。华中科技大学出版社4.4.3 段定义伪指令 编制一个80X86汇编语言源程序,段是基础,必须按段来构造程序,在程序执行时,要凭借4个段寄存器对各个段的存储单元进行访问。段结构伪指令主要有两条语句,即段定义伪指令和假定伪指令。1. 段定义伪指令SEGMENT/ ENDS格式:段名 SEGMENT 定位类型 组合类型 类别 段体 段名 ENDS 其中,段名是编程者给该段取的名字。定位类型、组合类型、类别是赋予该段的属性,当默认时,使用8086/8088宏汇编给定的默认值。华中科技大学出版社 定位类型规定了对该段的起始边界地址的要求,可以有以下4种选择: (1) PAGE:

36、段起始地址为一页(PAGE)的开始,规定256个字节为一页,页起始地址为XXXX XXXX XXXX 0000 0000,低8位为0。 (2) PARA:段起始地址为一节(PARAGRAPH)的开始,规定16个字节为一节,节起始地址为XXXX XXXX XXXX XXXX 0000,低4位为0。 (3) WORD:段起始地址为一规则字的开始,即偶地址开始,XXXX XXXX XXXX XXXX XXX0,最低位为0。 (4) BYTE:段起始地址为任意值,即从任何字节开始都行。 PARA定位类型为系统默认。华中科技大学出版社 组合类型表示该段与程序中其他段的关系。可以有以下6种选择: (1)

37、NONE:该段独立与其他段无关。 (2) PUBLIC:该段可与其他同名同类别的段相邻地连接在一起,共同拥有一个段基址。 (3) STACK:与PUBLIC相同,但作为堆栈段处理。 (4) COMMON:该段可能与其他同名同类别的段发生覆盖,共同拥有一个段基址,段的长度取决于最长的COMMON段。 (5) AT表达式:该段应放在AT后的表达式值(16位)所指定的段地址上。这种方式不能用与代码段。 (6) MEMORY:该段位于被连接在一起的其他所有段之上。 NONE组合类型为系统默认值。华中科技大学出版社 类别是由编程者赋予该段的与段名不同的另一种名字信息。程序中所有类别相同的段将被组成一个段

38、组,该段组以其们共同的类别作为名字。常使用的类别有“STACK”、“CODE”、“DATA”等。 功能:定义一个逻辑段,指定段的名字和范围,段在内存中的起始位置、段与段之间的连接关系。说明:(1) 段名由用户指定,开始与结束的段名须一致;(2) SEGMENT/ ENDS伪指令把程序分成若干逻辑段;(3) 删节号为段体,段体内为指令和伪指令序列。华中科技大学出版社2. 假定伪指令ASSUME 假定伪指令主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的对应关系。格式:ASSUME 段寄存器名:段名,段寄存器名:段名, 其中,段名是指用SEGMENT/ ENDS语句已定义的段名,也可以

39、是表达式“SEG 变量或标号”,或者是关键字NOTHING;段寄存器名可为CS、DS、SS、ES之一。 功能:该语句一般出现在代码段中,用来设定段寄存器与段之间的对应关系,以便汇编程序知道段的结构和在执行各种指令时知道应访问哪个段;也可用来取消段寄存器与段之间的对应关系(使用NOTHING时)。说明:华中科技大学出版社 (1) ASSUME伪指令设置在代码段内,第一个ASSUME语句一般放在段定义语句之后,是说明性语句; (2) 在一个代码段中,如果没有另外的ASSUME伪指令重新设置,则原有ASSUME语句的设置一直有效; (3) 不在当前段中的变量和数据存储单元均是不可访问的,否则,会在汇

40、编时产生错误或运行时造成混乱,产生逻辑上的错误,得出错误结果。 (4) ASSUME伪指令不产生任何目标代码,仅仅是告诉汇编程序,哪些段是当前段,而且分别与哪个段寄存器相联系。华中科技大学出版社 (5) 汇编程序不能检查在程序运行期间段寄存器内容是否与上述ASSUME语句的设置一致。如果在程序中间用ASSUME语句重建了DS或ES与某段的关系时,就一定要紧跟着将这个新段首地址送入DS或ES中,否则,会因段寄存器的内容未更改而使得后面数据的读写仍在原来的数据段中进行,这样的错误,系统是检查不出来的,即出现逻辑错误。 华中科技大学出版社 (6) 宏汇编MASM利用ASSUME给出的信息产生正确的目

41、标代码。在翻译过程中,根据ASSUME伪指令产生段寄存器段名对应表,以后根据此表决定在相应指令的代码之前是否产生段超越前缀。如果某段对应的段寄存器与该指令的默认段寄存器一致,则直接产生机器代码,否则就产生段超越前缀。因此,每一个汇编源程序必须使用ASSUME伪指令。但ASSUME伪指令并不实际给段寄存器赋值,必须在程序中用指令的实际操作来给段寄存器赋值,例如:MOV AX, DATAMOV DS, AX 这样的语句才给DS装入了一个实际的段基址。华中科技大学出版社4.4.4 过程定义伪指令 汇编语言中的子程序是以过程的形式出现的,子程序的调用,即过程的调用。定义过程的格式为过程名 PROC N

42、EAR/FAR 过程中的语句序列 RET 过程中的语句序列过程名 ENDP 其中,过程名由编程者任取;NEAR(默认值)或FAR是过程的类型,当为NEAR型时,可以不写;RET为过程返回主程序的出口语句。尽管源程序语序中RET的位置可放中间或结尾,但每一个过程最后执行的语句应为RET,否则会出错。 过程定义伪指令PROC和ENDP必须成对出现,以定义一个完整的过程。华中科技大学出版社4.4.5 宏处理伪操作1宏指令的定义 编程者可以将一组语句用宏指令定义成一条宏指令:宏指令名 MACRO, ;宏体 ENDM 其中宏指令名由编程者自取;形式参数意义同高级语言一样,在调用宏指令时用实在参数来代替。

43、宏指令也可以不设参数。华中科技大学出版社2宏指令的使用宏调用 经定义的宏指令,可以在程序中像其他指令一样直接使用。对于出现在程序中的宏指令,汇编程序在翻译时,按照其定义逐条还原为宏体中的语句。 使用宏指令时,需要将形式参数用一一对应的实在参数代替。当实在参数的个数多于形式参时,忽略多余的实在参数;当实在参数的个数少于形式参数时,多余的形式参数设为空白,这是汇编语言的规定。 宏指令中的参数可以是常数、寄存器名、存储单元名、地址表达式以及指令的助记符或助记符的一部分。华中科技大学出版社3. 取消宏指令伪指令PURGE 宏指令一经定义,在整个程序中有效。若宏指令名与指令或伪指令助记符相同,则宏指令优

44、先级更高,使同名指令或伪指令失效。在一般情况下,均不使用指令及伪指令助记符作为宏指令名,若出现了这种情况,也应在一定时候取消宏指令,使失效的指令或伪指令助记符恢复功能。取消宏指令伪指令PURGE格式如下:PURGE , 其中,宏指令名1、宏指令名2等是需要被取消的宏指令名。执行此伪指令后,这些宏指令便失效,不能再被调用了。华中科技大学出版社4. 定义局部标号伪指令LOCAL 在定义宏指令时,宏体中有可能出现标号。当宏指令在程序中多次被调用时,这些标号便会在多处出现,汇编程序将指出“标号重复定义”的错误。为避免这一错误,可以用LOCAL伪指令将宏体中的标号定义为局部标号,当多次调用宏指令时,汇编

45、程序在展开还原宏指令时,将用“?0000?FF”的编号来代替这些局部标号。LCOAL伪指令的格式为LCOAL 标号1,标号2,下面的例题,说明LOCAL的使用。华中科技大学出版社5. 宏指令应用举例 下面用一简单例子,来说明宏指令的定义及调用过程。【例4.17】 将对某一寄存器的移位操作定义为一个宏指令,并在程序中使用它。 完成移位操作的宏指令可以灵活地设置一个或多个参数,或不设参数。下面给出几种定义方式:(1) 不设参数。SHIFTMACROMOV CL,4SHL AX,CLENDM宏指令SHIFT将AX左移4次。华中科技大学出版社(2) 设一个参数,将移位次数设为参数CN。SHIFT MA

46、CRO CNMOV CL,CNSHL AX,CLENDM则SHIFT5 ;将AX左移5次SHIFT4 ;将AX左移4次 用实在参数5和4替代形式参数CN,完成CN次移位。华中科技大学出版社(3) 设两个参数,将被移位的寄存器和移位次数都设为可替代的参数。SHIFT MACRO CN,R MOV CL,CN SHL R,CL ENDM则:SHIFT 4,AX;将AX左移4次SHIFT 2,BX;将BX左移2次SHIFT 5,DH;将DH左移5次华中科技大学出版社(4) 设三个参数,将移位方向,被移位的对象及以为次数均设为参数。SHIFT MACRO CN,R,SD MOV CL,CN S&SD

47、R,CL ENDM当参数为助记符的一部分时,用&将参数标注出来,以便替换。则SHIFT 4,AX,HL;将AX左移4次SHIFT 7,BX,HR;将BX右移7次华中科技大学出版社 下面的程序说明如何在一个完整的程序中使用宏指令,源程序如下:SHITF MACRO R,CN MOV CL,CN SHL R,CL ENDMDATA SEGMENTX DB 08HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA华中科技大学出版社MAIN PROC FAR PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV BX

48、,OFFSET X MOV AL,BX SHIFT AL,4 RETMAIN ENDPCODE ENDS END MAIN华中科技大学出版社4.4.6 其他伪操作程序计数器$和ORG伪指令1. 程序计数器$ 当字符$独立出现在表达式中时,它的值为程序下一个所能分配的存储单元的偏移地址。例如:DATA SEGMENTA1 DB 10H,20H,30H;定义3个字节C EQU $A1 ;符号C与表达式$A1等价DATA ENDS 其中表达式 $A1的值为程序下一个所等分配的偏移地址03H减去A1的偏移地址00H,所以,$A1=03H00H=03H。华中科技大学出版社2. ORG伪指令 ORG伪指令

49、用来指定某条语句或某个变量偏移地址。格式为 ORG 数值表达式 ORG后的数值表达式的值将作为下一条指令语句或变量的偏移地址,例如:DATA SEGMENT ORG 2VAR1 DB 2,3,4 ORG $+3VAR2 DW 1234HDATA ENDS 则VAR1和VAR2在存储器中的分布情况如图4.3所示。 以上介绍了一些常用伪指令。8086/8088宏汇编还有诸如GROUP、TITLE、PAGE、RAGE、SUBTTL、LIST、XLISL、PUBLIC和EXTFN等伪指令。华中科技大学出版社图4.3 VAR1和VAR2在存储器中的分布情况4.5 汇编语言程序设计华中科技大学出版社 本节

50、将介绍程序设计的一般过程,以及一些基本的汇编程序设计方法。汇编语言程序设计步骤归纳如下:1.分析问题2.建立数学模型3.确定算法4.绘制流程图5.内存空间分配6.编制程序7.程序调试华中科技大学出版社4.5.1 顺序程序设计 直线运行程序,又叫顺序程序。这种程序的形式最简单,计算机执行程序的方式是指令逐条依次被执行,不进行判断和跳转,直到程序结束。实现直线运行结构程序的指令有数据传送类、算术运算类、逻辑移位类等。因此,直线运行结构程序只能完成简单的功能,例如计算表达式的值、顺序查表等。【例4.18】 编程计算Z=(x*x3*y)/ 2。设x、y为单字节正整数,结果Z用两个字节来存放。华中科技大

51、学出版社图4.4 例4.18 程序流程图华中科技大学出版社分析:本题采用顺序结构,程序框图如图4.4所示。源程序如下:DATA SEGMENTX DB 25Y DB 32Z DW ?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAEXPRE PROC FARSTART: PUSH DS ;保护返回地址 SUB AX,AX PUSH AX华中科技大学出版社 MOV AX,DATA ;初始化DS MOV DS,AX MOV AL,X MUL AL ;X2 MOV BL,Y ADDBL,BL ADD BL,Y ;3Y SUB AX,BX ;X23Y SHR AX

52、,1 ;(X23Y)/ 2 MOV Z,AX ;存结果 RET ;返回DOSEXPRE ENDPCODE ENDS END STATR ;汇编结束华中科技大学出版社4.5.2 分支程序设计 分支程序就是根据不同的情况或条件执行不同功能的程序,它具有判断和转移功能,在程序中利用条件转移指令对运算结果的状态标志进行判断,以实现转移功能。汇编语言中实现分支的要素有两个: (1) 使用能影响状态标志的指令,如算术逻辑指令、移位指令和位测试指令等,将状态标志设置为能正确反映条件成立与否的状态。 (2) 使用条件转移指令,对状态位进行测试判断,确定程序如何转移,形成分支。分支程序可以有简单分支结构和多分支

53、结构两种形式。华中科技大学出版社简单分支结构 (b) 多分支结构简单分支和多分支结构的流程图华中科技大学出版社1. 简单分支程序设计 简单分支程序根据条件是否满足将程序分为两个分支,按不同条件做出相应处理。这种程序常采用比较和测试的方法,在标志寄存器中设置相应的标志位,然后再选用适当的条件转移指令,以实现不同情况的分支转移。2. 多分支程序设计 在程序设计中,有时要求对多个条件同时进行判断,这样就可能对多个分支进行处理。连续使用两条条件转移指令就可以实现3路分支,依次类推,可完成多路分支。华中科技大学出版社图4.5 例4.19 的流程图华中科技大学出版社【例4.19】 编程计算下列函数的值:

54、1(X0) Y= 0(X=0) 1 (X0)X取值范围:128127。 分析:这是一个3分支问题,用两个条件转移指令来实现。源程序框图如图4.5所示。源程序如下:DATA SEGMENTX DB 3Y DB DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATATHREE PROC NEARSTART: PUSH DS XOR AX,AX PUSH AX华中科技大学出版社 MOV AX,DATA MOV DS,AX MOVAL,X CMPAL,0 JGEBIGER MOV AL,0FFH ;X0,1送Y单元 JMP NEXTEQUL: MOVY,AL ;X=0

55、,0送Y单元NEXT: RETTHREE ENDPCODE ENDS ENDSTART华中科技大学出版社4.5.3 循环程序设计 在程序中,往往要求某一段程序重复执行多次,这时候就可以利用循环程序结构。这里把能按一定规律,多次重复执行的一串语句,叫作循环程序。 常用的循环控制方法有计数法、条件控制法等。华中科技大学出版社1) 计数控制法 对于循环次数已知的循环程序,一般采用计数法来控制循环。计数法又分为正计数法和倒计数法。正计数法计数器的初值设置为0,每执行一遍循环体,计数器的值加1,然后与已知的循环次数比较,若相等则跳出循环,否则继续循环;倒计数法将计数器的初值设置为规定的循环次数每执行一遍

56、循环体,计数器的值减1,若计数器的值为0则跳出循环,否则继续循环。在汇编语言程序设计中常采用CX寄存器作为循环计数器。华中科技大学出版社2) 条件控制法如果循环次数事先无法确定,但与问题的某些条件有关。这些条件通过指令来测试。若测试比较的结果表明满足循环条件,则继续循环;否则结束循环。【例4.20】 存储器数据段存放了100个带符号数,其首地址为AREA,要求将各数据取绝对值后再送存原来的存储单元。华中科技大学出版社程序段如下:LEA SI,AREA;SI源地址MOV CX,100;CX循环次数CHECK:MOV AL,SI;取一个带符号数送ALOR AL,AL;AL内容不变,但影响标志位JN

57、S NEXT;若SF=0,则转NEXTNEG AL;否则求补MOV SI,AL;负数求补后送回NEXT:INC SI;源地址加1DEC CX;循环次数减1JNZ CHECK;循环次数不为0,转向CHECKHLT;停止华中科技大学出版社【例4.21】 从头搜索字符串的结束标志,统计搜索的字符个数。源程序如下:DATASEGMENTSTRINGDBABCDUVWXYZ, 0DHLLDB?CREQU0DHDATAENDSSTACKSEGMENT DB50 DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK STARTPRO

58、CFARBEGIN:PUSH DSMOVAX,0华中科技大学出版社PUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEADI,STRING ;设串的地址指针MOVDL,0 ;置串长度初值为0MOVAL,CR ;串结束标志ALAGAIN: SCASB;搜索串JEDONE ;找到结束标志,停止INCDL ;串长度加1JMPAGAINDONE:LEABX,LLMOV BX,DLRETSTARTENDPCODEENDSEND BEGIN 华中科技大学出版社4.5.4 子程序设计 子程序不是一种基本的程序结构,但合理使用子程序是实现模块化程序设计的重要技巧。子程序通常用于完成一些常用的、

59、需不规则重复进行的操作。编写好的子程序可构成一个子程序库,需要时用CALL语句调用即可。华中科技大学出版社图4.8 子过程嵌套调用示意图在设计子过程时应仔细考虑如何实现参数传递、现场保护及恢复等问题。华中科技大学出版社1参数传递 主过程和子过程常常需要交换数据,如:主过程可能需要向子过程传送处理信息(入口参数),子过程也可能需要向主过程返回处理结果(出口参数)。主过程和子过程之间的参数传递通常可以采用以下3种方式之一:(1)使用约定寄存器传递参数(2)使用约定存储单元传递参数(3)使用堆栈传递参数华中科技大学出版社2现场保护与恢复 这里所说的现场,是指主过程转向子过程执行时主过程的状态,主要包

60、括当时的标志寄存器、段寄存器、通用寄存器以及指令指针的内容。 把主过程中各有关参数都备份到堆栈中以后,子程序就可以随意使用CPU资源了。华中科技大学出版社【例4.22】编写一个软件延时子程序SDELAY。该程序具有双重循环结构:内循环完成约10ms的延时,外循环完成约(DL)*10ms的总延时。源程序如下:SDELAY PROC FARDEL1:MOV CX,2806 ;该指令花费4个时钟周期DEL2:LOOP DEL2 ;该指令花费175个时钟周期DEC DL ;该指令花费3个时钟周期JNZ DEL1 ;该指令花费164个时钟周期RET ;该指令花费32个时钟周期SDELAY ENDP华中科

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论