收藏 分享(赏)

第5章+汇编语言及汇编程序设计.PPT.ppt

上传人:j35w19 文档编号:5956974 上传时间:2019-03-22 格式:PPT 页数:149 大小:1.60MB
下载 相关 举报
第5章+汇编语言及汇编程序设计.PPT.ppt_第1页
第1页 / 共149页
第5章+汇编语言及汇编程序设计.PPT.ppt_第2页
第2页 / 共149页
第5章+汇编语言及汇编程序设计.PPT.ppt_第3页
第3页 / 共149页
第5章+汇编语言及汇编程序设计.PPT.ppt_第4页
第4页 / 共149页
第5章+汇编语言及汇编程序设计.PPT.ppt_第5页
第5页 / 共149页
点击查看更多>>
资源描述

1、第5章 汇编语言及汇编程序设计,本章主要教学内容 汇编语言和汇编程序的基本概念 汇编语言指令语句基本格式 汇编语言的表达式和运算符 伪指令语句的格式及功能 汇编语言程序的上机过程 汇编语言程序的设计方法 汇编编程的基本方法 系统功能调用,第5章 汇编语言及汇编程序设计,本章教学目的及要求 理解汇编语言和汇编程序的概念、特点及其应用。 掌握汇编语言源程序书写规则、语句的基本格式。 熟悉汇编语言的基本表达、伪指令语句及其应用。 熟悉汇编语言程序的上机运行、调试过程,掌握基本操作技能。 掌握汇编程序的基本设计方法。 熟悉系统功能调用的概念、方法,并掌握基本功能的用法。,第5章 汇编语言及汇编程序设计

2、,5.1 汇编语言和汇编程序的基本概念 5.2 指令语句的基本格式 5.3 表达式和运算符 5.4 伪指令语句的格式及功能 5.5 宏指令与条件汇编 5.6 汇编语言程序的上机过程 5.7 汇编语言程序的设计方法 5.8 汇编编程的基本方法 5.9 系统功能调用,5.1 汇编语言和汇编程序的基本概念,5.1.1 汇编语言 汇编语言是一种面向CPU指令系统的程序设计语言; 用助记符表示操作码,符号代表操作数或操作数地址,以及指令地址等; 相对于机器语言:易记、易读、易编写、易修改; 保留了机器语言面向硬件操作的优势,程序效率高(速度快/空间小); 主要用于系统程序和实时控制程序的编制。,5.1.

3、2 汇编程序 用汇编语言编写的程序(文本文件)称为源程序; 汇编语言源程序不能由机器直接执行,必须翻译成对应的机器代码,再由机器执行; 翻译源程序的过程叫汇编; 翻译出来的程序叫目标程序; 现有多种软件(程序)可以把汇编语言源程序翻译成目标程序,这些软件称为汇编程序; 常用汇编程序基本汇编ASM-86和宏汇编MASM-86。,5.1.3 汇编语言源程序的组成 指令:与CPU 指令系统具有一一对应关系的指令,亦称为硬指令;汇编时一条指令语句被翻译成对应的目标代码,对应着特定的操作。 伪指令:伪指令语句在汇编过程中通过一些管理控制性语句,告诉汇编程序应该如何汇编,它不产生目标代码,即不直接命令CP

4、U去执行什么操作 。 宏指令(使用宏汇编时):宏指令语句是由编程者按照一定的规则来定义的一种较“宏大”的指令,可包括多条指令或伪指令 。 表达式:根据汇编语言的语法要求,构成各种指令的操作对象,编译过程中会对其值进行计算。,5.2 指令语句的基本格式,5.2.1 8086/8088汇编语言指令语句的基本格式格式说明: 由前向后的箭头表示是可选项; 由后向前的箭头是重复项; 圆头框表示是语句中的关键字 。,5.2.2 指令语句的基本要求 1. 标号是指令的符号地址,必须以“:”结尾,是可选项。8086/8088汇编语言中使用的标号必须遵循下列规则: 字母(az,AZ),数字(09)或某些特殊字符

5、( 、_、 $、 ?等)组成; 第一个字符必须是除数字外的字符形式; “?”不能单独作为标号; 标号的有效长度为31位。 2. 助记符是指令名称的代表符号,是指令语句中的关键字,不可省略。必要时可以在指令助记符的前面加上一个或多个“前缀”,实现某些附加操作。,3. 操作数是指令执行需要的数据。 有些指令不需要操作数,可以默认; 有些指令需要多个操作数,必须以“,”将其隔开; 操作数可以是表达式。 4. 注释是对指令功能加以说明,方便阅读和理解程序,汇编程序不对它进行任何处理。 是可选项; 注释必须用“;”开头(单条语句)。,5.3 表达式和运算符,汇编语言源程序中,指令操作数除了可以是单独的常

6、数、寄存器、变量和标号外,还可以是表达式; 表达式是由常量、寄存器、变量、标号和运算符组成的序列; 程序汇编时,计算表达式并产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的地址信息(变量和标号),相应的表达式称为常量表达式和地址表达式。,5.3.1 常量、变量和标号 5.3.1.1 常量 常量是没有任何属性的纯数据; 汇编期间,其值已能完全确定,且在程序运行过程中也不会发生任何变化; 常量包括数值型常量和字符型常量; 数值型常量可分为整型数和实数; 整型数可以用二进制、八进制、十进制和十六进制形式表示; 实数用十进制形式给出。,1. 数值型常量 二进制数:由0和1组成的数字

7、序列,并以字母B结尾的数,如0100100B。 八进制数:由0,1,7组成,以字母Q结尾的数,如732Q。 十进制数:由09组成,并以字母D结尾或没有结尾字母的数,如92D,92。 十六进制数:由09,AF组成,以字母H结尾,如3F80H。其中如果以字母AF开始的十六进制数,须在之前加上数字0,以区别于符号,如0EFH。,实数:由整数、小数和指数三部分组成,对应计算机中的浮点表示法。其中,整数和小数部分称为尾数,可以是带符号的数。指数部分由指数标识符E开始,它表示了值的大小。实数表示法实际上就是数学中的科学计数法。实数的书写格式:整数部分. 小数部分E指数部分,如-0.31E4。 2. 字符型

8、常量 字符常量是以引号括起来的字符或字符串,这些字符以ASCII码形式出现在目标程序中。如AB,表示为41H、42H 。,5.3.1.2 变量变量对应于存放在存储单元(数据段、附加段或堆栈段 )中的数据,这些数据在程序运行期间随时可以修改。为便于对这些数据的访问,可以通过内存数据定义伪指令给它们定义变量名,变量名可以认为是数据存储单元的符号地址。定义后的变量具有三个属性: 段属性:表示变量所在的逻辑段。 偏移量属性:表示变量在逻辑段中的偏移地址。 类型属性:表示变量占用的存储单元数。该属性由定义变量的伪指令决定,说明该变量属性是字节DB,字DW,双字DD, 8字节DQ或10字节DT。,5.3.

9、1.3 标号标号是指令目标代码的符号地址。编写汇编语言源程序时,在转移指令中常用标号代替具体转移地址,这可以避免考虑程序汇编、连接后系统分配给指令代码的实际地址。标号也有三个属性: 段属性:表示指令代码所在的逻辑段。 偏移量属性:表示指令代码在逻辑段中的偏移地址。 距离属性:表示程序转移的类型。标号的距离属性有段内/近程(NEAR)和段间/远程(FAR)两种。,1算术运算符(7) 2逻辑运算符(4) 3关系运算符(6) 4分析运算符(5) 5. 属性运算符(4) 6分离运算符(2) 7. 运算符的优先级,5.3.2 运算符,1. 算术运算符 有、*、/、MOD(取余数)、SHL(左移)和SHR

10、(右移)共7种 ; 这类运算的结果都只取其整数部分(除法只取商的整数部分); 对于地址表达式,只有加法和减法,且参加运算的地址必须在同一逻辑段中。,【例】DATA SEGMENTX DB 11, 22, 33Y DW 0F44H, 55FFHDATA ENDSCODE SEGMENTMOV AL, X + 2 ;(X)11,(X+2)33,即33 ALMOV CL, 3*3/2 MOD 3 ; 3*3/2 4,4 MOD 31,即1 CLADD CL, 44H SHR 1 ; 44H SHR 122H,即CL+ 22H CLMOV BX, Y X ; Y X3,即3 BXCODE ENDS,2

11、. 逻辑运算符 有AND,OR,NOT,XOR共4种 ; 只能用于数值表达式,不能用于地址表达式。 【例】MOV AL, 0F0H AND 88H ;80H ALMOV DH, 0F0H OR 88H ;F8H DHMOV BL, 0F0H XOR 0AH ;FAH BLMOV CX, NOT 88H ;0FF77 CX,3. 关系运算符 有EQ,NE,LT,GT,LE和GE共6种 ; 当关系(条件)成立时,运算结果为全1(0FFH或0FFFFH),否则为全0 。 【例】MOV AL, 0F0H GT 88H ;0FFH ALMOV DH, 0F0H EQ 88H ;00H DH,4. 分析运

12、算符这是一类获取符号(变量和标号)属性的运算符,共5种:(1)SEG 运算符 (2)OFFSET运算符 (3)TYPE运算符 (4)LENGTH运算符 (5)SIZE运算符,(1)SEG 运算符 格式:SEG 变量或标号 功能:获得变量或标号所在段的段基址。 【例】MOV AX,SEG ARR ;符号ARR的段基址AX(2)OFFSET运算符 格式:OFFSET 变量或标号 功能:获得变量或标号的偏移地址。 【例】MOV BX,OFFSET BUF;符号BUF的偏移地址BX,(3)TYPE 运算符 格式: TYPE 变量或标号 功能:获得变量或标号的类型(属性)值。如果是变量,将返回该变量类型

13、对应的字节数;如果是标号,则返回代表标号类型的数值。类型与类型值之间的关系如表所示。【例】VR1 DB ABVR2 DW ?MOV AL, TYPE VR1 ; 1 ALMOV BL, TYPE VR2 ; 2 BL,(4)LENGTH 运算符 格式: LENGTH 变量 功能:获得变量所含的数据存储单元个数。如变量定义时没有用DUP伪指令,则运算结果为1 。 【例】DATA SEGMENTA DB ABCDEFB DW 10 DUP(1,2 DUP(2)C DB 3,20 DUP(0)DATA ENDSMOV AX,LENGTH A ;1AXMOV BX,LENGTH B ;10BXMOV

14、CX,LENGTH C ;1CX,(5)SIZE 运算符 格式: SIZE 变量 功能:获得变量所含的数据存储区大小,即SIZE= LENGTH 变量 TYPE 变量。 【例】DATA SEGMENT AGE DB 12HSCO DW 10 DUP(?)DATA ENDSMOV AX,LENGTH AGE ;1AXMOV CL,LENGTH SCO ;10BXMOV CL,SIZE SCO ;10220CX,5. 属性运算符这是一类控制或指定符号(变量和标号)属性的运算符,共4种:(1)PTR 运算符 (2)THIS运算符 (3)段超越前缀 (4)短转移前缀,(1)PTR 运算符 格式: 类型

15、 PTR 变量或标号 功能:为变量或标号指定新的类型(属性),暂时忽略其原始定义属性。 【例】DATA SEGMENT A DB 34H,12HB DW 5678HDATA ENDSMOV AX,WORD PTR A ;1234HAXMOV BL,BYTE PTR B ;78HBL,(2)THIS 运算符 格式: THIS 类型 功能:为紧跟在它后面的符号(变量或标号)定义一个新的类型。对于变量,该指令不分配存储单元。 【例】DATA1 EQU THIS BYTEDATA2 DW 1234H其中,DATA2是一个类型为字的变量,THIS运算符把DATA2的第一个字节单元定义为字节属性,并通过E

16、QU伪指令定义符号DATA1和DATA2的低字节使用同一个存储单元。 【例】 ADD1 EQU THIS FARADD2: MOV AL, DATA1JMP ADD1 ;相当于JMP FAR PTR ADD2,;给紧跟的下一条指令所在地址ADD2 定义一个FAR属性的标号ADD1,(3)段超越前缀 格式:段寄存器名:地址表达式 功能:当要使用非默认段中的存储器操作数时,可根据规则在地址表达式前指定所使用的逻辑段。 【例】MOV AX,ES: BX ;表示源操作数在附加段中。(4)短距离前缀SHORT 格式:SHORT 标号 功能:该前缀用来修饰转移指令目标地址的属性,指出该标号是在转移指令下一

17、条地址的128127字节范围内,使汇编语言只产生8位的偏移量 。 【例】JMP SHORT HELLO ;表示短距离跳转到HELLO位置。,6. 分离运算符分离运算符包括HIGH和LOW共2种,分别用于提取字数据的高、低位字节。 格式: HIGH/LOW 常量或地址表达式 功能: HIGH 用来分离出其后16位数据的高字节;LOW用来分离出其后16位数据的低字节。 【例】X DW 1234HMOV AH,HIGH X ;12HAHMOV BL,LOW X ;34HBL,7. 运算符的优先级 一个表达式中可以有多个不同的运算符同时出现; 汇编程序先计算高优先级的运算,再计算低优先级的运算,最后给

18、出表达式的值; 同一优先级不分高低,按表达式中的先后次序运算。,5.4 伪指令语句的格式及功能,伪指令是一种告诉汇编程序如何生成目标代码的说明语句,它不对应任何机器指令,只能被汇编程序识别,MASM86中可使用宏指令。,5.4.1 伪指令语句的基本格式 5.4.2 伪指令及其功能,5.4.1 伪指令语句的基本格式,1. 8086/8088汇编语言伪指令语句的基本格式格式说明: 由前向后的箭头表示是可选项; 由后向前的箭头是重复项; 圆头框表示是语句中的关键字 。,2. 伪指令语句的基本要求 符号名是一个任选字段,符号名后面不能用冒号“:”,以区别于指令语句。不同伪指令的符号名可以是常量名、变量

19、名、过程名、结构名、记录名等,可以作为指令语句和伪指令语句的操作数,此时符号名就表示一个常量或存储器地址; 伪指令字段是语句不可或缺的部分; 操作数的有无、个数、操作数类型等由伪指令字段具体确定。操作数可以是常量(数值和字符)、常量名、变量、标号,以及一些专用符号; 注释字段的格式和作用与指令语句时相同。,5.4.2 伪指令及其功能,5.4.2.1 符号定义伪指令 5.4.2.2 内存数据定义伪指令 5.4.2.3 段定义伪指令 5.4.2.4 段寄存器说明伪指令 5.4.2.5 定位伪指令 5.4.2.6 子程序伪指令,5.4.2.7 模块定义伪指令 5.4.2.8 外部符号定义伪指令 5.

20、4.2.9 记录伪指令 5.4.2.10 结构伪指令 5.4.2.11 块注释伪指令 5.4.2.12 补充伪指令,5.4.2.1 符号定义伪指令,汇编语言中允许使用符号; 符号定义伪指令的用途就是定义新的符号名称或定义新的类型属性。定义后的符号可以代替汇编语言的变量名、标号名、过程名、寄存器名以及指令助记符等在源程序中直接使用,编译时由原值代替; 使用符号定义伪指令可以方便程序的编辑、修改、简化语句、提高程序的可读性; 符号名称不能以数字开头,有效长度为31个字符。,(1)EQU伪指令 格式: EQU 功能:为表达式内容定义新的符号名(与属性运算符PTR或THIS联合使用,可为变量或标号定义

21、新的类型属性并重新命名)。 注意: EQU定义的符号不能再定义,除非用PURGE解除原定义; “”表示此项内容不能省略; 如果定义符号的表达式中引用了其他符号,必须事先定义; 该指令不涉及分配存储单元的问题。 【例】PORT EQU 88H ;定义符号PORT代表88H。DATA EQU PORT+2;定义符号DATA,符号PORT事先已经定义。LD EQU MOV ;定义符号LD代表助记符MOV。 DATA1 EQU THIS BYTEDATA2 DW 1234H ;定义DATA2字变量的低字节单元为DATA1且为字节属性。,(2)(赋值)伪指令 格式: 功能:为表达式内容定义新的符号名。

22、注意: 用等号伪指令定义的符号可以重复定义,无需解除原定义; 其余与EQU伪指令相同。 【例】 COST = 20 ; COST代表20M = MOV ; M代表MOVLOST = COST+10 ;30LOSTM = ADD ;M代表ADD,(3)LABLE伪指令 格式: LABEL 功能:定义与原有变量类型不同的新变量或为指令语句定义指定类型的标号,等于指令组合“EQU THIS”。 【例】 DBUF LABEL DWORDBUF DB 200 DUP(0) A LABEL FARB: LEA DX,BUF (4)PURGE伪指令 格式:PURGE 符号1,符号2, 功能:用来解除之前用E

23、QU伪指令定义的符号。,5.4.2.2 内存数据定义伪指令,1. 内存数据定义伪指令的一般格式 格式:变量名 数据定义伪指令 功能:告诉汇编程序在存储器中存入指定的数据,并允许给存储单元起名字,以方便访问。 注意: 指令中变量名是可选的(用符号“ ”表示); 数据表可由多个数据项组成(用“,”分隔),汇编程序按先后次序连续分配存储空间; 定义后的变量名只对应第一个所分配单元的地址。,2. 数据定义伪指令 DB伪指令:定义字节数据,数据表中的每个数据项都占用一个字节的存储空间,连续存放(地址递增)。 DW伪指令:定义字数据,数据表中的每个数据项都占用二个字节的存储空间,低字节在低地址,高字节在高

24、地址(每一个数据项不能多于两个字符长度)。 DD伪指令:定义双字数据,数据表中每个数据项都占用4个字节的存储空间。仅可给两个字符组成的字符串分配4个字节单元,且这两个字符ASCII码是存储在两个低位字节,另两个高位字节均存放00H。可以定义有小数点的十进制数或用科学计数法表示的数据,在汇编时被译成4字节的浮点数。DQ伪指令:定义4字数据,数据表中每个数据项都占用8个字节的存储空间。允许浮点数形式,与DD指令相同,但高4个字节填0。 DT伪指令:定义10个字节数据,数据表中每个数据项都占用10个字节的存储空间。允许浮点数形式,处理方法与DQ伪指令相同(高6个字节填0)。若数据表中的数据项是十进制

25、整数书写的,汇编程序将以压缩BCD码格式存放。,3. 数据表使用约定(1) 数值形式的数据项,其数字位数必须与所定义的存储单元相符。【例】为数据段分配存储单元。 DATA SEGMENTA DB 11H,12HB DW 1122H,3344HC DD 12345678H DATA ENDS,A,B,C,DATA,3. 数据表使用约定(2) 字符串数据项必须用引号( )括起;在字节定义伪指令中,字符串可以连续书写(不超过255个字符) ,每个字符按先后次序以ASCII码形式依次存放,而在其他数据定义伪指令中,字符串的字符个数要符合相应指令的要求。【例】为字符串分配存储单元。DATA SEGMEN

26、TA DB 1234B DW AB,CC DD ABDATA ENDS,A,B,C,3. 数据表使用约定(3) 地址表达式形式的数据项,如变量名(或标号),只能用于DW和DD数据定义伪指令中。其中,用DW伪指令是取偏移地址来初始化变量,用DD伪指令则是取段首址和偏移地址来初始化变量。【例】 DATA SEGMENTA DB 11H,12HB DW 1122HBUF1 DW A BUF2 DD B DATA ENDS,A,B,DATA 1234H: 5678H,BUF2,BUF1,3. 数据表使用约定(4) “?”数据项可以按照数据定义类型预留存储空间,但初值为不确定,可以代替任何形式的数据项;

27、【例】 DATA SEGMENTA DB ?B DW ?C DD ? DATA ENDS,A,B,C,3. 数据表使用约定(5) 数据项表达式中可以使用重复数据操作符DUP,为连续的存储单元提供重复数据,其格式为:N DUP(表达式)其中N为重复因子,只能取正整数,表示定义了N个重复数据存储单元,其类型由它前面的数据定义伪指令确定,而每个数据存储单元中的初值由DUP后面圆括号中的表达式给定。【例】定义以BUF为首址,大小为100个字节,初值为0的数据存储单元。BUF DB 100 DUP(0),BUF,BUF + 99,3. 内存数据定义伪指令综合举例【例】VAR1 DB 32H, ABC V

28、AR2 DW 1234H, 40H, ABDD 12345678HDB ?, 11000011B ARRY1 DB 2 DUP (0, 1) ARRA2 DW 2 DUP (?, 1),VAR1,VAR2,ARRY1,ARRY2,5.4.2.3 段定义伪指令,1. 汇编语言源程序的分段结构 8086/8088系统的存储器是分段管理的; 程序、数据、堆栈通常放在不同的逻辑段中(除COM文件); 每个逻辑段的长度不超过64KB; 当程序代码或数据内容较长,或者使用分立模块编写时,程序和数据可以放在不同的逻辑段中; 段定义伪指令通过段属性说明,为程序编译、连接时对各段的定位、组合和连接进行控制。,2

29、. 段定义伪指令 格式:SEGMENT 定位方式 连接方式 类别名ENDS 功能:通过对段的属性进行说明,为程序编译、连接时对各段的定位、组合或连接进行控制 。 注意: 每个段必须有一个段名,且起始段名须与结束段名相同; 各个段的段名可以相同,也可以不同; 段属性说明都是可选项,均有对应的默认值。,3. 段属性说明 (1)定位方式(定位类型) 定位方式指段起始地址的边界方式,共4种:PAGE,段起始地址的低8位是0,即段起始地址是256的整数倍,称为按页边界定位; PARA,段起始地址的低4位是0,即段起始地址是16的整数倍,称为按段边界定位,这是系统的默认定位方式; WORD,段起始地址的最

30、低位是0,即段起始地址是2的整数倍,称为按字段边界定位; BYTE,段起始地址可以是任意值,没有限制。,(2)连接方式(组合类型) 连接方式告诉连接程序该段以何种方式与其他段进行连接,共6种 : NONE,本段与其他段逻辑上没有关系,有独立的段地址,这是系统默认连接方式; PUBLIC,本段与其他同名同类别的段连接起来,形成一个物理段。它们具有相同的段起始地址,但偏移地址不同,其连接次序由连接命令指定; STACK,表示本段是堆栈段,连接方式同PUBLIC。源程序至少有一个堆栈段,否则连接程序提出警告并取约定堆栈;,COMMON,连接时把本段与其他同名同类别的段共用一个物理段。它们具有相同的段

31、地址,但程序运行时这些段产生覆盖,使用完毕的段被即将使用的段覆盖。覆盖技术可以节省存储器空间,是在有限的内存中运行大型程序的有效手段; MEMORY,表示本段连接时定位在所有段之上,即高地址处。如果连接时有几个指定MEMORY段,则第一个作为MEMORY段,其他的作为COMMON段; AT,直接控制连接程序把段地址设为表达式所计算出来的16位值,该方式不能用于代码段。 (3)类别名类别名使用自定义符,必须用单引号括起来。凡是类别名相同的段在连接时均按先后次序连接起来。,【例】有段定义内容如下:DATA1 SEGMENT PARA PUBLIC DATA1M1 DB 45H DUP(0) DAT

32、A1 ENDS DATA2 SEGMENT PARA COMMON DATA2N1 DB 102H DUP(0) DATA2 ENDS DATA1 SEGMENT PARA PUBLIC DATA1M2 DB 104H DUP(11H) DATA1 ENDS DATA2 SEGMENT PARA COMMON DATA2N2 DB 105H DUP(0) DATA2 ENDS DATA3 SEGMENTT1 DB 50H DUP(20H) DATA3 ENDS,连接后段的定位组合方式,5.4.2.4 段寄存器说明伪指令,格式:ASSUME 段寄存器:段名1,段寄存器:段名2 功能:在对汇编源程

33、序进行汇编时,用以建立段寄存器与逻辑段之间的对应关系。 注意: 该伪指令一般出现在代码段中; 在编制目标为.EXE型可执行文件时,无需对CS、SS和SP进行初始化,而DS和ES必须用数据传送指令在程序执行时进行赋值。,【例】用ASSUME伪指令建立段寄存器与逻辑段之间的对应关系。DATA1 SEGMENTA DB 1,2,3 DATA1 ENDS STAC SEGMENT STACKDB 200 DUP(0) STAC ENDS DATA2 SGEMENTB DB 123ABC DATA2 ENDS DATA3 SEGMENTC DB 3 DUP(?) DATA3 ENDS,CODE SEGM

34、ENTASSUME DS:DATA1,ES:DATA3,CS:CODE, SS:STACSTART: MOV AX,DATA1MOV DS,AX ;DATA1DSMOV AX,DATA3MOV ES,AX ;DATA3ESMOV AL,AMOV C,ALASSUME DS:DATA2 ;建立DS与B段的对应关系MOV AX,DATA2MOV DS,AX MOV AL,BMOV C,ALCODE ENDS END START,5.4.2.5 定位伪指令,1. 汇编地址计算器(程序计数器)$8086/8088宏汇编中的字符“$” 具有特殊意义,称为汇编地址计数器或程序计数器。出现在源程序表达式中的

35、 “$”符号,其值为下一个能分配存储单元的偏移地址。 【例】 DATA SEGMENT VAR1 DW 100HVAR2 DB 1,2, +1,+2N EQU -VAR2 ; ()=6,N =4DATA ENDS,(2)ORG伪指令 格式:ORG 功能:告诉汇编程序把以下的程序或数据从表达式指定的偏移地址开始存放,即将数值表达式的值赋给汇编地址计数器$。表达式为非负整数(00FFFFH)。(2)EVEN伪指令 格式:EVEN 功能:偶地址定位伪指令告诉汇编程序把以下的程序或数据从偶地址开始存放。,【例】DATA SEGMENTX DB 10HEVENY DW 0200HORG 06HZ DB

36、A DATA ENDS,5.4.2.6 子程序伪指令,格式: PROC NEAR/FAR(RET) ENDP 注意: 子程序有NEAR/FAR两种类型;NEAR为段内(近程)调用过程,主程序和子程序在同一个段中。此时,堆栈中只需保存偏移地址;FAR为段间(远程)调用过程,此时堆栈中须保存偏移地址和段地址;系统默认是NEAR类型; 当需要某个子程序既能在段内调用又能在段间调用,则须定义两个子程序名(利用属性运算符)。,5.4.2.7 模块定义伪指令,1. 模块的基本概念 设计较大型程序时,往往把程序分成若干个部分来编写; 每个部分在各自的源程序文件中,由汇编程序汇编成相应的目标代码; 通过连接程

37、序将各目标代码连接成一个完整的程序; 每个部分称为一个模块,各模块可以分别命名。,2. 模块开始伪指令 格式:NAME 模块名 功能:指明程序模块的开始,并指出模块名。 注意: 模块名是自定义符号,不能是系统保留字; 若该指令缺省时,则取TITLE伪指令语句中页标题的前6个字符;若TITLE语句也缺省,则取源程序文件名为模块名 。,3. 模块结束伪指令 格式:END 启动标号/过程名 功能:指明汇编源程序结束。在主模块中该指令同时给出主程序的入口位置。 注意: 指令中给出的启动地址只有在主模块中才有意义 ; 当主程序以子程序形式编写时,必须指明启动标号或主程序(过程)名。,【例】 NAME S

38、AMPLE DATA SEGMENTX DB 10H DATA ENDS STACK SEGMENTDW 128 DUP(0) STACK ENDS CODE SEGMENTASSUME CS:CODE, DS:DATA, ES:DATA1, SS:STACK START : MOV AX, DATAMOV DS, AX CODE ENDSEND START,5.4.2.8 外部符号定义伪指令,1. 外部符号的基本概念 在模块化程序设计中,各模块之间需要互相访问; 当某一模块需要访问(或引用)另一模块中定义的符号时,必须对这些符号进行说明; 这些符号包括变量、符号常量、标号和子程序名,统称为外

39、部符号。,2. 公用符号伪指令 格式:PUBLIC ,符号名2, 功能:被说明的符号可以被其他模块引用。 3. 引用符号伪指令 格式:EXTRN ,符号名2:类型, 功能:说明本模块中需要引用其他模块中定义的符号。 注意: 类型包括BYTE, WORD, DWORD, NEAR, FAR等和ABS,ABS表示符号常量 ; 类型说明须与该符号在原模块中的定义相一致; 被说明的符号在本模块中不能再定义使用。,【例】 模块1:EXTRN VAR2: BYTE, LAB2: FARPUBLIC VAR1, LAB1DATA SEGMENTVAR1 DW 0800HDATA ENDSCODE SEGME

40、NTLAB1: CODE ENDS,模块2:EXTRN VAR1: WORD, LAB1: FARPUBLIC VAR2, LAB2DATA SEGMENTVAR2 DB 0FFHDATA ENDSCODE SEGMENTLAB2: CODE ENDS,5.4.2.9 记录伪指令,在实际应用中,有时信息的单位不是一个字节或一个字,可将其定义为记录形式按位实现信息组合。1. 记录定义伪指令2. 记录内存分配伪指令3. 记录操作符,1. 记录定义伪指令 格式: 记录名 RECORD ,字段名2: 宽度, 注意: 记录由若干字段组成,每个字段有自己的名称; 字段宽度为字段所占的二进制位数,可以是11

41、6; 一个记录的各字段宽度之和应在116之间; 宽度和不超过8位时,汇编程序将记录按字节处理,否则按字处理; 宽度和不是8或16位时,所有字段靠右对齐到字节或字的最低位; 记录定义伪指令不真正为记录分配内存单元,它只是在汇编时对有关记录的使用做出说明。,2. 记录内存分配伪指令 格式:变量名 记录名 功能:按照记录定义的顺序将字段值表中的各数据赋予相应的字段中,字段表中缺省的字段按0赋值。 注意:赋值语句中的尖括号“”不能省略。 【例】PRODUCT RECORD SN:4, WORK: 1, VR: 2X PRODUCT Y PRODUCT ,3. 记录操作符 (1)WIDTH操作符 格式:

42、WIDTH 记录名或字段名 功能:求出记录或字段的有效位宽度 。 【例】PRODUCT RECORD SN:4, WORK: 1, VR: 2MOV AX, WIDTH PRODUCT ; AX 7MOV BL, WIDTH SN ; BL 4,(2)MASK操作符 格式:MASK 记录字段名 功能:给出一个对应于记录长度的8位或16位二进制数,其中指定字段名所在的位为1,其余位为0 。 【例】PRODUCT RECORD SN:4, WORK: 1, VR: 2MOV AH, MASK SN ; AH 01111000BMOV BL, MASK WORK; BL 00000100B,(3)记

43、录字段名 格式:记录字段名 功能:作为指令的一个操作数单独出现时,它表示该字段最低位在记录中的位置 。 【例】PRODUCT RECORD SN:4, WORK: 1, VR: 2MOV AH, SN ; AH 3MOV BL, VR ; BL 0,5.4.2.10 结构伪指令,结构是一种在高级语言中常用的数据形式;它把一组相关的数据组合在一起,当作一个整体来处理;各项数据称为结构的字段。 1. 结构定义伪指令2. 结构内存分配伪指令3. 结构引用,1. 结构定义伪指令 格式: 结构名 STRUC结构名 ENDS 注意:和记录定义一样,结构定义仅对结构使用作说明,并不具体分配内存空间。 【例】

44、 STUDENT STRUCNUM DW ?NAME DB ABCDSEX DB ?SCORE DB ?STUDENT ENDS,2. 结构内存分配伪指令 格式:变量名 结构名 功能:与记录分配伪指令相同,只是缺省值取结构定义中的初始值 。 注意:赋值语句中的尖括号“”不能省略。 【例】STU1 STUDENT STU2 STUDENT ,3. 结构引用 格式一:结构变量名. 字段名 格式二:地址寄存器. 字段名 注意:地址寄存器的内容为结构变量第一个字节的偏移地址。 【例】MOV AX, X1. NUM ; X1的学号送给AXMOV AX, BX. NUM; BX指向的结构变量的学号送给AX

45、,5.4.2.11 块注释伪指令,格式:COMMENT 定界符 注释 定界符 注意: 程序中单行注释,可用分号“;”引导;注释较长时,可用COMMENT伪指令定义; 定界符可以是任何非空字符,且第一个定界符必须在COMMENT的语句行中,而注释和结束定界符可以在其他语句行中。【例】 COMMENT /(注释)/,5.4.2.12 补充伪指令,1. 列表文件说明伪指令列表文件(.LST)在源程序被汇编时产生,是包含目标代码生成相关信息的文本文件。 (1)TITLE伪指令 格式:TITLE 标题 功能:在列表文件每页的第一行开始给出所定义的大标题,方便程序的分类阅读,相当于整个程序的注释。 注意:

46、标题的长度不超过60个字符。,(2) SUBTTL伪指令 格式:SUBTTL 小标题 功能:为列表文件定义小标题,输出在大标题之后,对具体程序段做进一步说明。 注意:小标题的长度不超过60个字符。 (3) PAGE伪指令 格式:PAGE 行数,列数 功能:为列表文件每页定义行数和列数。 注意:每页的行数和列数可取值10255行和60132列,默认值是66行,80列。,2. 隐含进位制伪指令 格式:RADIX 表达式 功能:规定在源程序中书写数据时的隐含进位制方式 。 注意: 表达式的值是216之间的十进制整数; 遇到新的RADIX语句则改变隐含进位制。 3. 包含伪指令 格式:INCLUDE

47、功能:在本模块汇编时,将另一模块的内容插入该伪指令处一起汇编。 注意:被插入的模块可以是不完整的。,5.5 宏指令,宏指令是程序员自己定义的指令; 把需要重复使用的程序段定义为宏指令,在源程序中用一条宏指令代表该程序段; 可以有效缩短源程序的长度,使源程序易读,并可减少由于重复书写引起的错误。 5.5.1 宏指令与子程序的区别5.5.2 宏指令的用法( 条件汇编),5.5.1 宏指令与子程序的区别,宏指令在汇编时由宏汇编程序识别,并被替换成所代表的程序段;而子程序是一段由CALL指令控制CPU去执行的程序; 源程序中的宏指令在汇编时,都分别被替换成所代表的程序段,所以使用宏指令不能缩短目标程序

48、的长度;而子程序的目标代码是一段可以被多次运行的代码段,不论使用多少次,它只是同一段代码,只占用一段存储器空间。所以,使用子程序可以缩短目标程序的长度,即节省内存空间;,子程序的使用需要把主程序的断点以及有关的中间数据放入到堆栈,返回时又要恢复现场和断点地址,这些操作要耗费CPU的时间;而宏指令的使用不存在这些问题,没有主程序、断点和返回的概念。所以,相对于子程序而言,宏指令是用牺牲代码长度来换取执行时间的减少; 一条宏指令可以使用不同的参数代表不同的程序段,而子程序一旦定义,它的目标代码就是不可改变的。所以,宏指令比子程序更灵活。 综上所述,对于重复使用的程序段,如果需要一种灵活和执行速度快的方法来简化源程序,则选择使用宏指令;如果重复使用的程序段长且变化不大,同时希望提高目标代码的使用效率,则使用子程序方式。宏指令可以与子程序嵌套使用。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报