收藏 分享(赏)

第4章-汇编语言程序设计1.1.ppt

上传人:天天快乐 文档编号:967749 上传时间:2018-05-09 格式:PPT 页数:70 大小:1.33MB
下载 相关 举报
第4章-汇编语言程序设计1.1.ppt_第1页
第1页 / 共70页
第4章-汇编语言程序设计1.1.ppt_第2页
第2页 / 共70页
第4章-汇编语言程序设计1.1.ppt_第3页
第3页 / 共70页
第4章-汇编语言程序设计1.1.ppt_第4页
第4页 / 共70页
第4章-汇编语言程序设计1.1.ppt_第5页
第5页 / 共70页
点击查看更多>>
资源描述

1、1,第4章 汇编语言程序设计,2,主要内容:,汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计,3,4.1汇编语言源程序 (1)机器语言二进制数形式的指令和数据。 B0 64 是什么意思?这就是机器语言。既不直观,又不易理解和记忆. MOV AL,64H ;很容易记忆理解,这就是助记符。 (2)助记符用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主要特征,便于人们理解和记忆。,4,操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,改动也很麻烦。于是人们采用标号或符号来代替地址,例:

2、LP1: MOV AX,VAR LOOP LP1 (3)汇编语言指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。 用汇编语言编写的程序叫汇编语言源程序。,指令除了操作码以外,还有一个操作数问题。,5,汇编程序(翻译程序),源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,6,汇编语言程序设计与执行过程,输入汇编语言源程序 EDIT/NOTEPAD等 源文件 .ASM汇编(编译) MASM /ASM等 目标文

3、件 .OBJ链接 LINK等 可执行文件 .EXE调试 DEBUG/TD等 最终正确的程序.EXE,目前都把上述的软件集成在统一的环境下,以方便用户使用。,建立、编辑 汇编 连接 运行 调试,7,4.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由3个(或4个)逻辑段组成: 数据段存放数据、变量 (附加数据段存放数据、变量) 堆栈段堆栈区域 代码段存放程序指令,8,一个基本的汇编语言程序框架如下: stack SEGMENT PARA stack DB 100 DUP(stack) stack ENDS data SEGMENT data ENDS co

4、de SEGMENT ASSUME CS:code, DS:data, ES:data, SS:stack start: MOV AX, data MOV DS, AX MOV ES, AX MOV AL, 4CH INT 21H code ENDS END start,堆栈段,数据段,代码段,真指令,9,0000:03FF,环境与代码运行,FFFF:0,堆栈段,数据段,代码段,CS:IP,DS,SS:SP,系统起始运行程序,中断向量区(系统专用),栈底,最多4个活动段,分段结构,ES,10,4.1.2 汇编语言的语句类型与格式,汇编语言的语句有两种:指令性语句由8086指令助记符(真指令)构

5、成的语句指示性语句由伪指令构成的语句指令性语句的格式为:标号: 指令助记符 目的操作数,源操作数;注释 指示性语句的格式为:名字 伪指令 操作数1, 操作数2, ;注释 注:各部分之间至少要用一个空格(或逗号、分号)作为分隔符。,11,指示性语句(伪指令)由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无机器码指令与其相对应。,指令性语句(真指令)由CPU执行,每一条指令性语句都有一条机器码指令与其对应;,注意: 指令性语句汇编时生成机器码; 指示性语句汇编时不生成机器码。,12,语句的构成元素:1.标号指令的符号地址,用来代

6、表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。2.名字段、过程、变量或宏的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。标号与名字统称为标识符一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写一个程序中,每个标识符的定义是唯一的,还不能是汇编语言采用的保留字保留字是汇编程序已经利用的标识符,主要有:真指令助记符例如:MOV、ADD伪指令助记符例如:DB、EQU操作符例如:OFFSET、PTR寄存器名例如:AX、CS,13,3.指令助记符8086真指令、伪指令助记符4

7、.操作数即指令的操作对象对指令性语句(真指令)0,1,2个对指示性语句(伪指令)根据需要而定操作数之间以逗号分隔操作数可以是:寄存器、存储单元、常数或表达式 例如:AX,DI+BX+10,200,16*8+TABLE,等等,14,例如:以下为同一条指令写的注释 1)MOV CX,100 ;传送100到CX 2)MOV CX,100 ;循环计数器置初值 显然,第二种写法要比第一种写法要好。,5.注释以分号开头,可放在指令后,也可单独一行。,注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。,注释不能加程序的汇编,不生成目标程序,只为阅读方便。,15,汇编语言的一个实例: hell

8、o.asm data SEGMENTHello DB Hello, world!,0DH,0AHdata ENDSprog SEGMENT ASSUME CS:prog,DS:datastart: MOV AX,data MOV DS,AX LEA DX,hello;取字符串首地址 MOV AH,9 INT 21H;显示字符串 MOV AH,4CH INT 21H;退回DOSprog ENDS END start,名字,标号,16,4.1.3 数据项与表达式,1常量二进制数,以B或b结尾。如01001101B。十进制数,以字母D或d结尾,缺省情况下,后缀D或d可以省略如85。十六进制数,以H结

9、尾。以字母AF开头的十六进制数,前面要用0表达,以避免与其他符号混淆,如0F160H。字符串:用引号括起来的1个或多个字符。 如ERROR!, a,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H, 61H。,数据项(操作数的形式)包括常量、标号/名字、变量及表达式。,17,有三个属性: 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 类 型:NEAR或FAR NEAR表示标号所在语句与转移指令/调用指令在同一码段内,跳转时只需改变IP即可。 FAR 标号所在语句与转移指令/调用指令不在同一代码段内。跳转时需改变CS和IP即可。 若没有

10、对类型进行说明,默认为NEAR。标号通常作为转移指令或CALL指令的转移地址。,2.标号/名字指令或数据所在内存单元的符号地址,如 Start : MOV AX, data JMP/CALL Start Hello DB 06H,45H,44H,PTR,18,变量也有三个属性:段地址变量所在段的段地址偏移量变量单元地址与段首地址之间的位移量。类 型有BYTE、WORD 、DWORD三种之一。变量在程序中作为存储器操作数被引用。,3.变量,如 Start : MOV AX, data,PTR,变量即内存中的存储单元或数据区。 变量名是存储单元(数据区)的符号地址 或 名字。,19,例如: 正确的

11、:LP1, AGAIN, NEXT, _GO, OK_1 错误的:4M, LOOP, AAA, #HELP, +ONE,标号和变量名的使用规则:,组成:A-Z(不分大小写), 0-9, ? . _ $不能以数字开头,以免与十六进制数相混。长度小于31个字符不能与保留字(指令助记符、伪指令、预定义符号等)重名对定义的符号不区分大小写。,20,注:变量要事先定义才能使用变量类型应与指令要求的操作数类型相符。例:MOV BL,V1; 要求V1应该是字节属性的变量。变量定义后,变量名只对应这个数据区的首地址,若有这个数据区有若干个数据项时,其地址要改变。指令中的操作数的段基地址不直接表示出来,是默认的

12、。在使用变量时,其段属性应与其所指的段寄存器相符,若不相符,要加上段超越。,21,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。有数字表达式和地址表达式两种。汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。,如 Start : MOV AX, 16*8+TABLE,22,用于地址表达式, 例:LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为: LEA SI,1003H,(1)算术运算符 +、-、*、/,MOD,用于数字表达式, 例:MOV AX,4*1024 汇编后的

13、形式为: MOV AX,4096,23,注意: 不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。,(2)逻辑运算符 AND、OR、XOR、NOT,逻辑运算符只能用于数字表达式中。 例: MOV CL,36H AND 0FH 经汇编后:MOV CL,06H,24,例: MOV BX, PORT GT 300H 若PORT的值大于300H为真,则汇编后为: MOV BX, 0FFFFH 若为假,则汇编后为: MOV BX, 0,(3)关系运算符EQ、NE、LT、GT、LE

14、、GE,关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1 关系为假,结果为全0,25,(4)取地址运算符SEG、OFFSET,SEG: 取变量/标号的段地址OFFSET:取变量/标号的偏移地址,例:VAR DB 12H MOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,SEG VAR ;取变量VAR的段地址,注意:SEG、OFFSET只能对符号地址操作MOV AX , SEG BXMOV BX , OFFSET SI,26,例:VAR DW 1,2,3,4,5 则 TYPE VAR = 2 LENGTH VAR = 1 SIZE VAR = 2,(5)取值运算

15、符TYPE、LENGTH、SIZE,TYPE 取变量的类型(1,2,4)LENGTH 取所定义变量的长度 (无DUP时为1,有时为DUP前面的值)SIZE 取所定义存储区的字节数 (=TYPE * LENGTH),27,LENGTH和SIZE运算符的具体运算规则是:如果变量是用重复操作符DUP定义的,那么运算符LENGTH的运算结果是外层DUP的给定值 (即外层重复次数),如果没有用DUP定义的变量,运算结果总是1。 而运算符SIZE是LENGTH和TYPE两个运算结果的乘积。 【例】取出变量占存储单元个数。 DATASEGMENT A DBABCDEF BDW10DUP(1,2DUP(2)

16、DATAENDS MOVAX,LENGTH A;1AX MOVBX,LENGTHB;10BX,28,SIZE A = LENGTH A*TYPE A = 1 SIZE B = LENGTH B*TYPE B = 20,若BUFFER存储区是用如下伪指令定义: BUFFER DW 200 DUP(0) 则: TYPE BUFFER 等于2 LENGTH BUFFER等于200 SIZE BUFFER等于400,29,(6)属性运算符PTR,用来指定地址操作数的类型。格式: PTR 类型BYTE, WORD, DWORD和 NEAR, FAR ,SHORTBYTE、WORD、DWORD 用于描述数

17、据存储单元(变量)地址NEAR、FAR (SHORT ?) 用于描述转移、调用的目的地址,30,例:MOVBYTE PTRDI,0 ;字节类型 MOVWORD PTRDI,0 ;字类型 MOVDI,0B5H ;类型不定PTR也可用来进行强制类型转换例:STR1 DW ? ;STR1定义为字类型 MOVAX,STR1 ;合法 MOVAL,STR1 ;非法 MOV AL,BYTE PTR STR1 ;合法,31,7)其它运算符方括号“ ” 指令中用方括号表示存储器操作数,方括号的内容表示操作数的偏移地址例:MOV AX,1000H段重设运算符“:”它跟在段寄存器名之后,表示段重设,用来指定一个存储

18、器操作数的段属性而不管其原来的隐含的段是什么。例:MOV AX,ES:DI,32,在计算具有多个运算符的表达式值时,按以下规则操作: 优先级高的先运算,优先级低的后运算。 当优先级相同时,按表达式中从左到右的顺序进行运算 使用括号可以提高表达式运算的优先级。 表达式中的运算符的优先级,33,4.2 伪指令,数据定义 伪指令符号定义 伪指令段定义和段寄存器指定 伪指令过程定义 伪指令结束 伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。常用的伪指令有:,34,4.2.1 数据定义伪指令(变量定义),功能:用于定义变量的类型,给变量赋初值或给变量分配存储空间。数据定义伪指令的格式为:变量名

19、 数据定义伪指令 操作数,操作数,常用的数据定义伪指令有如下几种: DB 定义字节 DW 定义字 DD 定义双字 DQ 定义四字 DT 定义十字节,35,变量名为用户自定义标识符,表示操作数首元素的逻辑地址;用这个符号表示地址,常称为符号地址变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址设置变量名是为了方便存取它指示的存储单元,变量名,36,操作数,操作数是用逗号分隔的参数主要由数值常数、字符串、表达式或?、DUP组成?表示初值不确定,即未赋初值;DUP表示重复初值DUP的格式为:重复次数 DUP(重复参数),37,1)定义字节单元伪指令DB,DB伪指令用于分配一个或多个

20、字节单元,并可以将它们初始化为指定值初值表中每个数据一定是字节量(Byte),存放一个8位数据: 可以是0255的无符号数 或是128127带符号数 也可以是字符串常数,datasegment;数据段Xdb a,-5db 2 dup(100),?Ydb ABCdataends,字节单元定义实例,38,2)定义字单元伪指令DW,DW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值初值表中每个数据一定是字量(Word),一个字单元可用于存放任何16位数据: 一个段地址一个偏移地址 两个字符 065535之间的无符号数 3276832767之间的带符号数,datasegment;数据段co

21、untdw 8000h,?,ABmaxintequ 64hnumberdw maxintarraydw maxint dup(0)dataends,字单元定义实例,39,3)定义双字单元伪指令DD,DD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值初值表中每个数据是一个32位的双字量(Double Word): 可以是有符号或无符号的32位整数 也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针varddDD 0,?,12345678hfarpointDD 00400078h,40,例1:DATA_B DB 10,5,10HDATA_W DW 100H,-4

22、DATA_D DD 0FFFBH汇编后的内存分配情况如右图所示。,Q,DATA_B,DATA_W,DATA_D,100H,-4,0FFFBH,41,例2:操作数可以是字符串,例如STR DBHELLO 汇编后的情况如图:,STR,H,E,L,L,O,注意:下面两个定义的不同之处:DBAB ;41H在低字节,42H在高字节(先A后B)DW AB ;42H在低字节,41H在高字节(先B后A),48H,45H,4CH,4CH,4FH,注意:3个及其以上的字符,只能用DB定义,42,操作数?用来保留存储空间,但不存入数据.例3:ABC DB 0,1,2,3,4,OK,$ RSV DW ?,?,?,?,

23、?,?,?,?复制操作符DUP: 重复的数据可以使用复制操作符DUP,如上面RSV亦可写成: RSV DW 8 DUP(?),43,4.2.2 符号定义伪指令,把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。 符号定义伪指令有两种:EQU,=,用EQU定义的符号未清除前,不能重新定义。用”=”定义的符号可在任何时候进行重定义。二者均不占用存储空间,仅是给符号赋值,44,1、EQU CR EQU 0DH ;常数 A EQU ASC - TABLE ;变量(事先已定义) STR EQU 64 1024 ;数值表达式 ADR EQU ES:BP + DI + 5 ;地址表达式

24、EQU不允许对一个符号重复定义。2、等号语句 = 同 EQU ,但可重新定义一个符号。 COUNT = 100 同 COUNT EQU 100 CONNT = 57 COUNT重新定义,45,例:FIVE EQU 5 COUNT = 10 DIST = BYTE PTRSI+BP GOTO = JMP MOV AX, TEN MOV CX, COUNT ADD DIST, FIVE DIST = WORD PTRSI+BP+1 ADD DIST, AX GOTO LABEL,定义,引用,46,4.2.3 段定义伪指令,汇编语言程序是按段来组织程序和数据的。 和存储器的物理段相对应,汇编语言程序

25、中的段称为逻辑段。汇编连接后被映射到物理段中。3/4类段:代码(程序)、数据/附加数据、堆栈段定义伪指令:SEGMENT、ENDS定义一个段的基本格式: 段名 SEGMENT 定位类型组合方式类别 段名 ENDS,47,这两个伪指令总是成对出现,二者前面的段名应一致,但不能与保留字重名.SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。 对数据段和堆栈段,段中的语句一般是变量定义。 对代码段则是指令语句。如: data SEGMENT data ENDS,SEGMENT和ENDS伪指令,48,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。它的格式为:,1. 定

26、位类型 说明如何确定逻辑段的边界。有4种:PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为0H。默认类型BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地址应为00H。,也即:PAGE(页边界) - 能被256除;PARA(段边界) -能被16除; WORD(字边界) - (能被2除);BYTE (字节边界),段名 SEGMENT 定位类型 组合类型 类别,49,2.组合

27、类型 功能:用在具有多个模块的程序中,用于说明不同模块中同名段的组合方式,共6种:NONE : 本段与其它逻辑段不组合 。PUBLIC: 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中,构成一个大的逻辑段。STACK : 专用于说明堆栈段,组合方式同PUBLICCOMMON : 所有此类型的同名段具有相同的起始地址(覆盖),各个逻辑段重叠在一起,共享相同的存储区域。MEMORY :本逻辑段置于地址最高处,多个时取第一个,其余作为COMMON AT :使段地址是表达式所计算出来的16位值,CS除外。,50,【例】有两个模块,各模块段定义如下模块1: DATA1SEG

28、MENT PARA PUBLIC DATA1M1DB 45H DUP(0)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N1 DB 102H DUP(0)DATA2ENDSEND,模块2:DATA1SEGMENT PARA PUBLIC DATA1M2DB 104H DUP(11H)DATA1ENDSDATA2SEGMENT PARA COMMON DATA2N2DB 105H DUP(0)DATA2ENDSDATA3SEGMENTT1DB 50 DUP(20H)DATA3ENDSEND,51,该段的定位组合方式示意图如图所示。,52,3.类别 用单引号 括起来

29、的字符串。如代码段CODE”所有同类别的段被安排在连续的存储区域中。类别名相同的逻辑段按出现的先后顺序排列.如:在模块1中有段定义: seg1 SEGMENT PARA STACK stack seg1 ENDS 在模块2中有段定义: seg2 SEGMENT PARA STACK stack seg2 ENDS则连接时这两个段被安排在一起。,53,4.2.4设定段寄存器伪指令,ASSUME伪指令用于指明已定义的段与段寄存器之间关系。 格式为:ASSUME 段寄存器:段名 ,段寄存器:段名. 其中段寄存器名必须是CS ,DS,ES 和SS中的一个。段名必须是由SEGMENT定义的段中的段名。

30、也就是说ASSUME指令是告诉汇编程序用SEGMENT指令定义过的段的段地址将放在哪个段寄存器中.,例: DATA1SEGMENT ADB 1,2,3 DATA1ENDS CODE SEGMENT ASSUME DS:DATA1,CS:CODE . CODE ENDS,54,注意: ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值。故下面的语句 MOVAX,data MOVDS,AX MOVES,AX MOVAX,stack MOVSS,AX 将段基址装入段寄存器。如果程序中用到堆栈段,则SS也需装入实际的初值。 代码段基地址不需要程序员装入CS寄存器,

31、而由操作系统(OS)负责装入。,55, 段定义伪操作:,完整的段定义格式举例,data segment ; 定义数据段 data ends;-extra segment ; 定义附加段 extra ends;-code segment ; 定义代码段 assume cs:code, ds:data, es:extrastart: mov ax, data mov ds, ax ; 段地址 段寄存器 code ends end start,注:汇编时,系统自动将代码段的段地址装入CS,不用在程序中初始化,其它的段则要用指令把其初始化.,56,结论:1. ASSUME语句只起指示作用, 没有赋值作

32、用2. 程序中用到内存操作数时, 应按操作数的寻址方式, 给相应的段寄存器赋值。,57,4.2.5 过程定义伪指令PROC、ENDP,过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)。 过程定义伪指令的格式为 PROC NEAR/FAR 类型 RET ENDP 注意:PROC和ENDP必须成对出现且同一过程的名字必须相同。,若为近调用,则类型可省,58,过程的类型有两种: NEAR表示段内调用 (默认类型) FAR 表示段间调用 调用一个过程的格式为:CALL ,程序经汇编、连接及装入内存后, 过程名为一具体的内存地址,指示子程序入口。

33、过程名常用作CALL调用指令的操作数,子程的最后安排RET返回指令,使执行完子程后能返回调用处。,59,例1 display PROC RET ;NEAR 属性的过程对应段内返回 display ENDP例2 display PROC FAR RET ;FAR属性的过程对应段间返回 display ENDP,60,4.2.6 宏定义伪指令,宏指令:是源程序中具有独立功能的一段程序代码,程序员事先根据需要自定义的“指令“。此后在宏指令出现的地方,汇编程序自动把它们替换成相应的语句序列。宏指令的使用过程为宏定义、宏调用。,1、宏定义 格式:宏指令名 MACRO 形参,形参 ENDM,61,说明:

34、宏指令名是为该宏定义所起的名字,可以象指令助记符一样出现在源程序中; 形参间用逗号隔开,在宏指令调用时,形参被实参依次取代,形参为可选项; MACRO表示宏定义开始,ENDM表示宏定义结束,二者之间的程序段称为宏体。,62,2、宏调用 格式:宏指令名 实参,实参 功能:宏指令名的调用就是宏调用,它要求 汇编程序把定义的宏体目标代码拷贝到调用点;调用时实参依次替代形参,实参数目与形参数目可以不相同,当实参数多于形参数时,忽略多余实参,当实参数少于形参数时,剩余的形参处理为空白。,63,例: 两个数之和的宏定义和宏调用。 宏定义为:DADD MACRO X,Y,Z MOV AX,X ADD AX,

35、Y MOV Z,AX ENDM,上面宏定义中,X、Y、Z是形式参数。 调用宏DADD时可写为: DADD DATA1,DATA2,SUM 上面宏调用中,DATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z,即形实结合。,64,CALL DADD,RET,DADD:,CALL DADD,CALL DADD,DADD yy,DADD MACRO xx,DADD yy,DADD yy,ENDM,相同,=,或,主程序+过程(子程序),主程序+宏定义,宏扩展,宏调用 与 过程(子程序)调用 异同点示意图,65,宏调用 与 过程(子程序)调用 异同点相同点: 都是一次定义,多次调用。不同

36、点: 执行形式:宏命令伪指令由宏汇编程序在汇编过程中进行处理;而CALL、RET则是由CPU执行的指令。 汇编结果:宏命令伪指令汇编后被展开。 执行速度:宏命令执行速度较快(因无调用转移) 占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元; 使用过程可以节省代码(源程序和目标程序)占用的内存空间。,66,3.宏展开:汇编程序会把宏调用按宏定义展开。例如:宏定义为: DISPLAY MACRO string LEA DX,string MOV AH,9 INT 21H ENDM 程序中宏调用: DISPLAY ERROR_MESSAGE DISPLAY EXIT_MESSAGE

37、 汇编后的结果:(带有+号的指令为宏展开后的结果) + LEA DX,ERROR_MESSAGE + MOV AH,9 + INT 21H + LEA DX,EXIT_MESSAGE + MOVAH,9 + INT 21H,67,4.2.7汇编结束伪指令END,汇编语言源程序的最后,要加汇编结束伪指令END,以使汇编程序结束汇编。 格式: END 表达式 END后跟的表达式通常就是程序第一条指令的标号,指示程序的启动地址(要执行的第一条指令的地址)。汇编程序对 END 之后的语句不进行处理。程序中所有有效语句应放在 END 语句之前。源程序中必须有 END 结束语句。汇编程序对无 END 语句

38、的源程序不进行处理,只给出无 END 语句错误信息。,68,(1) NAME 伪指令 格式: NAME 模块名在源程序开始可用 NAME 模块命名,模块名的作用是指示给连接程序进行连接用。 源程序中可无模块定义,此时源文件名作为模块名。,4.2.8模块定义和连接伪指令,69,(2)模块间通信伪指令 在编写规模较大的汇编语言源程序时,可以将整个程序划分为几个独立的源程序,称之为模块。 将各模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。 各模块之间可以相互进行符号访问。 为了进行模块之间连接和实现相互的符号访问,以便进行变量传送,通常使用以下几个伪指令: PUBLIC、EXTRN。,

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

当前位置:首页 > 企业管理 > 经营企划

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


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

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

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