1、第三章 第4章 汇编语言程序设计,第4章 汇编语言程序设计,4.1 概述 4.2 汇编语言程序的格式与基本语法 4.3 伪操作命令与宏指令 4.4 DOS与BIOS的调用 4.5 汇编语言程序设计,主要内容:,汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计,4.1 概述,一、机器语言(Machine Language)二进制数形式的指令和数据。 B0 64 这就是机器语言。既不直观,又不易理解和记忆.目标程序(Object Program)用机器语言编写的程序,MOV AL,64H ;这就是助记符。 助记符用便于记忆的英语单词表示的指令操作码。它反映了指令的功能和主
2、要特征,便于人们理解和记忆。,二、汇编语言(Assembly Language)指令助记符,符号地址,标号,伪指令等语言元素的集合以及这些元素使用的规则。,采用标号或符号来代替地址,汇编语言源程序(Source Program)用汇编语言编写的程序。,操作数可能放在存储器中,这就涉及操作数的地址。程序中遇到转移指令或调用指令,也需要知道转移地址,若采用具体地址就很不方便,一旦有错,改动也很麻烦。,10D1:0100 09750B OR DI+0B,SI 10D1:0103 807C0A2C CMP BYTE PTR SI+0A,2C 10D1:0107 7505 JNZ 010E 10D1:0
3、109 FF36A22C PUSH 2CA2 10D1:010D 41 INC CX 10D1:010E 93 XCHG BX,AX 10D1:010F 33D2 XOR DX,DX 10D1:0111 EBA7 JMP 00BA 10D1:0113 33D2 XOR DX,DX 10D1:0115 33C0 XOR AX,AX 10D1:0117 FF36952C PUSH 2C95 10D1:011B C3 RET 10D1:011C 33D2 XOR DX,DX 10D1:011E 0BC9 OR CX,CX,汇编程序,源程序的编译程序,汇编程序,汇编语言源程序,机器语言目标程序,汇编源
4、程序需翻译成机器语言,变成可执行文件,机器才能执行,这个翻译过程叫汇编。高级语言中称该过程为“解释”或“编译”。执行翻译的程序称为“汇编程序”。,汇编语言程序设计与执行过程,输入汇编语言源程序,源文件 .ASM,汇编(编译),目标文件 .OBJ,链接,可执行文件 .EXE,调试,最终程序,MASM、DEBUG,MASM X.ASM,LINK X.OBJ,X.EXE,三、高级语言(High level Language),适合于描述各种算法,不依赖于计算机结构和指令系统。 可移植性好,编成方法适合人们的习惯、通用性好。 编译和解释程序复杂,占内存大,产生目标代码长。执行速度慢。处理中断和接口困难
5、。,高级语言源程序,目标 程序,编译,编译软件程序或解释软件程序,4.1.1 汇编语言源程序的结构,汇编语言源程序通常由一个或几个程序模块组成,每个模块一般由三个逻辑段组成:数据段存放数据、变量堆栈段堆栈区域代码段存放程序指令,堆栈段,数据段,代码段,一个基本的汇编语言程序框架如下:,4.2 汇编语言源程序的格式与基本语法,汇编语言的语句有三种: 指令性语句由8086指令助记符构成的语句,由CPU执行,每一条指令性语句都有一条机器码指令与其对应。 指示性语句由伪指令构成的语句,由汇编程序执行。它指出汇编程序应如何对源程序进行汇编,如何定义变量、分配存储单元以及指示程序开始和结束等。指示性语句无
6、机器码指令与其相对应。 宏指令语句简化汇编语言,可以用一条宏指令指令代替定义过的一段程序,汇编时将该段程序插入对应程序中。,一、语句的种类,指令性语句的格式为:标号: 指令助记符 目的操作数,源操作数 ;注释 指示性语句的格式为:名字 伪指令 参数1,参数2,参数n ;注释 宏指令语句的格式为:标号: 宏指令 参数1,参数2,参数n ;注释注:各部分之间至少要用一个空格作为分隔符。,二、语句的构成元素: 标号指令的符号地址,用来代表指令在存储器中的地址。只能出现在指令性语句中,标号后应加上冒号。 名字段、过程、变量的名字,用来代表它们在存储器中的地址。只能出现在指示性语句中,名字后不加冒号。
7、指令助记符8086助记符、伪指令 操作数即指令的操作对象 对指令性语句0,1,2个 对指示性语句根据需要而定 操作数之间以逗号分隔 操作数可以是:寄存器、存储单元、常数或表达式例如:AX,DI+BX+10,200,16*8+TABLE,等等,注释以分号开头,可放在指令后,也可单独一行。注意注解的写法。要写指令(段)在程序中的作用,而不要写指令的操作。例如:以下为同一条指令写的注释1)MOV CX,100 ;传送100到CX2)MOV CX,100 ;循环计数器置初值显然,第二种写法要比第一种写法要好。,汇编语言的一个实例: hello.asmdata SEGMENT Hello DB Hell
8、o, world!,0DH,0AH,$ data ENDS prog SEGMENTASSUME CS:prog,DS:data start: MOV AX,dataMOV DS,AXLEA DX,hello ;取字符串首地址MOV AH,9INT 21H ;显示字符串MOV AH,4CHINT 21H ;退回DOS prog ENDSEND start,名字,标号,三、数据项与表达式,数据项包括常量、变量、标号及表达式。 1.常量 常数 二进制数,以B结尾。如01001101B。 十进制数,如85。 十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。 字符串:用引号括起
9、来的1个或多个字符。如ERROR!, a,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H和61H。 数值符号名:用伪指令定义的(EQU)符号名. 常量表达式:用各种运算符与各种数值常数组成的可求值的表达式。由汇编程序计算而得。,有三个属性:段地址:即标号所在段的段地址;偏移量:标号所代表存储单元的段内偏移地址;类 型:NEAR或FAR:NEAR表示标号所在语句与转移指令/ 调用指令在同一码段内,跳转时只需改变IP即可。FAR标号所在语句与转移指令/调用指令不在同一代码段内。若没有对类型进行说明,默认为NEAR。 标号通常作为转移指令或CALL指令的转移地址。,2
10、.标号指令所在内存单元的符号地址,变量即内存中的存储单元或数据区。变量名是存储单元(数据区)的符号地址或名字。 变量也有三个属性: 段地址变量所在段的段地址 偏移量变量单元地址与段首地址之间的位移量。 类 型有BYTE、WORD和DWORD三种。 变量在程序中作为存储器操作数被引用。,3.变量,标号和变量名的使用规则 组成:A-Z(不分大小写), 0-9, ? . _ $ 不能以数字开头,句号(.)只能作为首字符 长度小于31个字符 不能与保留字(指令助记符、伪指令、预定义符号等)重名 不能重复定义 例如:正确的:LP1, AGAIN, NEXT, _GO, OK_1错误的:4M, LOOP,
11、 AAA, #HELP, +ONE,4.表达式,表达式是常数、寄存器、标号、变量与运算符的组合。 有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。 表达式中的运算符有5类:算术运算符、逻辑运算符、关系运算符、分析运算符和合成运算符。,用于数字表达式,例:MOV AX,4*1024 汇编后的形式为:MOV AX,4096 用于地址表达式,例:LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为:LEA SI,1003H,1)算术运算符 +、-、*、/,MOD,SHL,SHR,逻辑运算符只能用于数字表达式中。例:MOV
12、 CL,36H AND 0FH经汇编后:MOV CL,06H注意,不要把逻辑运算符与逻辑运算指令混淆:例:AND AX, 3FC0H AND 0FF00H汇编后源操作数被翻译为:3F00H,所以上述指令与AND AX, 3F00H等价。,2)逻辑运算符 AND、OR、XOR、NOT,关系运算的结果是一个逻辑值:真或假关系为真,结果为全1关系为假,结果为全0,3)关系运算符EQ、NE、LT、GT、LE、GE,例:MOV BX,PORT GT 300H; 若PORT的值大于300H,则汇编后为:MOV BX,0FFFFH 否则汇编后为: MOV BX,0,例: MOV BX,(PORT GT 30
13、0H) AND 20H) OR (PORT LE 300H) AND 30H)若PORT的值大于300H,则汇编后为:MOV BX,20H否则汇编后为:MOV BX,30H,SEG:取变量/标号的段地址 OFFSET:取变量/标号的偏移地址 例:VAR DB 12HMOV BX,OFFSET VAR ;取变量VAR的偏移地址 MOV AX,SEG VAR ;取变量VAR的段地址 注意,以下指令的异同:MOV BX, OFFSET VARLEA BX, VAR OFFSET只能取静态的偏移地址; LEA指令即可取静态的偏移地址,也可取动态的偏移地址。,取地址运算符SEG、OFFSET,4)分析运
14、算符: 分析对MEM(变量或标号)的三个重要的属性。,TYPE 取变量的类型(1,2,4) LENGTH 取所定义变量的长度(即变量中元素的个数) SIZE 取所定义存储区的字节数(=TYPE*LENGTH) 例:VAR DW 20 DUP(?),2DAT1 DB 5,1则 TYPE VAR = 2LENGTH VAR = 20SIZE VAR = 40 LENGTH、SIZE 仅用于带DUP的外层有效,取值运算符TYPE、LENGTH、SIZE,格式 运算符 操作数,SEG OFFSET TYPE,变量名或标号 变量名或标号 标号 或变量名,返回其所在段的段基址 返回其所在段的偏移地址 返回
15、其属性值NEAR、FAR DB、DW、DD、DQ、DT,变量名 变量名,LENGTH SIZE,1、 2、 4、 8、 10,-1、 -2,元素个数 字节数,SIZE=TYPE*LENGTH,用于带DUP的外层有效,6)合成运算符PTR、THIS,用来指定地址操作数的类型。 格式: PTR 类型BYTE, WORD, DWORD, NEAR, FAR BYTE、WORD、DWORD用于描述数据存储单元(变量)地址 NEAR、FAR用于描述转移、调用的目的地址,变量:指令中临时指定的变量的新属性 可利用PTR指定地址相同而类型不同的新变量,例:MOV BYTE PTRDI,0 ;字节类型MOV
16、WORD PTRDI,0 ;字类型MOV DI,0B5H ;类型不定 例:STR1 DW ? ;STR1定义为字类型 STR2 EQU BYTE PTR STAR1MOV AX,STR1 ;合法MOV AL,STR1 ;非法MOV AL,BYTE PTR STR1 ;合法MOV AL,STR2,标号:可用PTR建立地址相同而类型不同的新符号。可临时指定其标号的新属性。 C1 SEGMENTASSUME C1:CSJMP NEAR PTR NEXT;超前引用 FNEXT EQU FAR PTR NEXTFFNEXT EQU THIS FAR NEXT:MOV BX,100 C2 SEGMENTC
17、2:CSJMP FNEXT ,符号 equ this 类型 另一符号;放于被指定类型前,6.汇编运算符(THIS),格式:THIS 类型可以像PTR一样建立一个指定类型的地址操作数,该操作数的段地址和偏移地址与下一个存储单元地址相同。,例: BUFB EQU THIS BYTE BUFW DW 1234H,5678H . MOV AX,BUFW ;AX=1234H MOV BL,BUFB ;BL=34H,BUFB的偏移地址和BUFW完全相同,但它是字节类型;而BUFW则是字类型。,P237页 运算符的优先级,4.3 伪操作命令与宏指令,数据定义伪指令 符号定义伪指令 模块定义伪指令(段) 过程
18、定义伪指令 宏指令 模块连接 列表伪指令,由汇编程序执行的指令,它本身不被汇编成机器指令。这里仅介绍MASM常用的伪指令。,4.3.1 数据定义与存储器分配伪指令(define),用于定义变量,即内存单元或数据区。 数据定义伪指令的格式为: 变量名 数据定义伪指令 操作数,操作数,DB、DW、DD、DQ、DT 作用:定义变量类型属性,并可以进行初始化 常数或表达式 字符串(hello表示其ASC值的) ?(该单元不初始化,预留出存储空间) 带DUP表达式 n dup(操作数) 带$(表示地址计数器当前值),常数或表达式: DATA_B DB 10,5,10H DATA_W DW 100H,-4
19、 DATA_D DD 0FFFBH,注意下面两个定义的不同之处: DB AB;41H在低字节;42H在高字节 DW AB;42H在低字节,;41H在高字节,操作数可以是字符串,例如 STR DB HELLO,操作数?用来保留存储空间,但不存入数据. 例3:ABC DB 0,1,2,3,4,OK,$RSV DW ?,?,?,?,?,?,?,?复制操作符DUP: 重复的数据可以使用复制操作符DUP,如上面RSV亦可写成:RSV DW 8 DUP(?),若操作数中若使用$,则表示的是地址计数器的当前值。 例: TABLE DB 10 DUP(?)BUFFER DW TABLE,$+3 设TABLE的
20、偏移地址为0080H,则汇编后如下图所示: $表示当前存储单元的偏移地址。,BUFFER,0080H,80H,TABLE,008AH 008BH 008CH 008DH,. . .,8FH,00H,00H,0089H,10 Bytes,DATA SEGMENTDAT1 DB 40HDAT10 EQU WORD PTR DAT1 DAT9 EQU THIS WORDDAT2 DW 00H,23HDAT3 DB 2 DUP(20H)DAT4 DB AB DAT5 DW ABDAT6 DW ?,$+3DAT7 DB 25H*4A1 EQU 10HDAT8 DB 2 DUP(2 DUP(A1) DAT
21、A ENDS CODE SEGMENTASSUME CS:CODE,DS:DATAMOV AX,DATAMOV DS,AXMOV BX,SEG DAT2MOV CX,OFFSET DAT2 XX: MOV DX,TYPE DAT2MOV AX,TYPE XXMOV AL,LENGTH DAT3MOV AH,LENGTH DAT8MOV BL,SIZE DAT8mov ah,4ch int 21h CODE ENDSEND,?H,?H,10H,00H,94H,10H,10H,10H,10H,09H,10H,41H,42H,42H,41H,20H,20H,00H,23H,00H,00H,40H,D
22、AT9,DAT10,D:MASM1DEBUG DEFINED.EXE -D 1254:0000 40 00 00 23 00 20 20 41-42 42 41 00 00 10 00 94 #. ABBA. 1254:0010 10 10 10 10 00 00 00 00-00 00 00 00 00 00 00 00 1254:0020 B8 54 12 8E D8 BB 54 12-B9 01 00 BA 02 00 B8 FF 8TX;T.9:8. 1254:0030 FF B0 02 B4 00 B3 00 B4-4C CD 21 00 00 00 00 00 .0.4.3.4LM
23、!. 1254:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 1254:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 1254:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 1254:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 -,AX=0000 BX=0000 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000
24、 DS=1244 ES=1244 SS=1254 CS=1254 IP=0020 NV UP DI PL NZ NA PO NC 1254:0020 B85412 MOV AX,1254 -T AX=1254 BX=0000 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1244 ES=1244 SS=1254 CS=1254 IP=0023 NV UP DI PL NZ NA PO NC 1254:0023 8ED8 MOV DS,AX -T AX=1254 BX=0000 CX=0082 DX=0002 SP=0000 BP=0000
25、 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0025 NV UP DI PL NZ NA PO NC 1254:0025 BB5412 MOV BX,1254 -T AX=1254 BX=1254 CX=0082 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0028 NV UP DI PL NZ NA PO NC 1254:0028 B90100 MOV CX,0001 -T AX=1254 BX=1254 CX=0001 DX=
26、0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=002B NV UP DI PL NZ NA PO NC 1254:002B BA0200 MOV DX,0002 -,AX=1254 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=002E NV UP DI PL NZ NA PO NC 1254:002E B8FFFF MOV AX,FFFF -T AX=FFFF
27、BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0031 NV UP DI PL NZ NA PO NC 1254:0031 B002 MOV AL,02 -T AX=FF02 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0033 NV UP DI PL NZ NA PO NC 1254:0033 B402 MOV AH,02
28、 -T AX=0202 BX=1254 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0035 NV UP DI PL NZ NA PO NC 1254:0035 B302 MOV BL,02 -T AX=0202 BX=1202 CX=0001 DX=0002 SP=0000 BP=0000 SI=0000 DI=0000 DS=1254 ES=1244 SS=1254 CS=1254 IP=0037 NV UP DI PL NZ NA PO NC 1254:0037 B4
29、4C MOV AH,4C -,4.3.2 符号定义伪指令,用EQU定义的符号未清除前,不能重新定义。清除EQU定义可用PURGE伪指令。 用”=”定义的符号可在任何时候进行重定义。 二者均不占用存储空间,仅是给符号赋值,格式: 符号名 EQU或= 表达式,把一个表达式用一个符号表示,以后凡出现该表达式的地方都可用这个符号表示。类似于C语言中的#define。 符号定义伪指令有两种:EQU,=,可以为数值和地址及其表达式,变量,标号、指令助记符,例:FIVE EQU 5COUNT EQU CXTEN EQU 10DIST = BYTE PTRSI+BPGOTO = JMP MOV AX, TEN
30、MOV CX, COUNTADD DIST, FIVEDIST = WORD PTRSI+BP+1ADD DIST, AXGOTO LABEL,定义,引用,4.3.3 程序模块定义伪指令,当功能复杂、大型的程序设计任务,先分解成多个相对独立的小任务,单独编写 、调试、汇编。,格式: NAME module_name,1、NAME可省 2、NAME省后文件模块名?(1)若有TITLE test ,默认test前6字符(2)都无,为源文件名(x.asm)为模块名,TITLE test,END 表达式,最多6个字符,以字母开头,可指定每页的打印标题,60多字符(列表文件上),1、可不加表达式,默认第
31、一条成机器码指令的地址 2、每个模块仅有一个END主模块:END 表达式,为第一条代码的标号。子模块:不加表达式,汇编结束伪指令,END后不形成机器码,一、模块定义伪指令,二、段定义伪指令,汇编语言源程序是按段来组织程序和数据的。汇编语言程序中的段称为逻辑段。汇编连接后被映射到物理段中。 三类段:代码(程序)、数据、堆栈 段定义伪指令:SEGMENT、ENDS、ASSUME、ORG 定义一个段的基本格式:段名 SEGMENT 定位类型组合方式类别段名 ENDS,这两个伪指令总是成对出现,二者前面的段名应一致。SEGMENT说明了一个段的开始,ENDS说明了一个段的结束。 对数据段和堆栈段,段中
32、的语句一般是变量定义。对代码段则是指令语句。 如: data SEGMENTdata ENDS,(一)SEGMENT和ENDS伪指令,SEGMENT语句后可以带有可选参数,用以规定逻辑段的其他一些属性。,1) 定位类型 说明如何确定逻辑段的边界。有四种: PARA(Paragraph): 逻辑段从一个节 (16个字节) 的边界开始。即段的起始地址应能被16整除, 或这说段起始物理地址应为0H。默认类型 BYTE : 逻辑段从字节边界开始,即段可以从任何地址开始。 WORD : 逻辑段从字边界开始。即段的起始地址必须是偶数。 PAGE : 逻辑段从页边界开始。256字节称为一页,故段的起始物理地
33、址应为00H。,2) 组合类型 说明不同模块中同名段的组合方式。 PUBLIC : 所有此类型的同名段组合成一个逻辑段,公用一个段地址,运行时装入同一个物理段中。 COMMON : 所有此类型的同名段具有相同的起始地址(覆盖),共享相同的存储区域。 AT : 按绝对地址定位,段地址就是表达式的值。 STACK : 专用于说明堆栈段,组合方式同PUBLIC,3) 类别 用单引号括起来的字符串。所有同类别的段被安排在连续的存储区域中。 如:在模块1中有段定义:seg1 SEGMENT PARA STACK stackseg1 ENDS在模块2中有段定义:seg2 SEGMENT PARA STAC
34、K stackseg2 ENDS 则连接时这两个段被安排在一起。,(二)、ASSUME伪指令,功能:在代码段中,说明段和段寄存器的关系,并未将段寄存器赋值。 格式: ASSUME 段寄存器:段名,段寄存器:段名 例: ASSUME CS:code, DS:data, ES:data :程序段比为CS,堆栈段必须为SS该语句一般放于代码段的最前面。仅是说明性语句,除CS外(由系统赋值),各段寄存器均需在程序中赋值取消语句 ASSUME NOTHING,段寄存器的填入:,1、代码段段寄存器CS及指令指针IP的填入当汇编程序扫描到程序结束伪指令END符号地址时,系统自动将当前代码段基址CS同时将EN
35、D后面的符号地址的偏移地址IP,(若无符号地址,将第一条可执行性语句的偏移地址IP),2、数据段段寄存器DS及扩展数据段段寄存器ES的填入由指令填入MOV AX,段名MOV DS,AXMOV AX,段名MOV ES,AX,3、堆栈段段寄存器SS及堆栈指针SP的填入系统自动填入当定义段的组合类型为STACK时。 即STACK SEGMENT STACK;将相同名连接在一起形成一个大的堆栈段DW 200 DUP(?)STACK ENDS 系统自动将此段段基址SS段长度SP 用指令填入当定义段的组合类型缺省(非STACK)代码段中用MOV指令来完成,S_SEG SEGMENTSTA DB 200 D
36、UP(?) S_SEG ENDS C_SEG SEGMENTASSUME CS:C_SEG,SS:S_SEG START:MOV AX,S_SEGMOV SS,AXMOV SP,SIZE STA;或mov sp,length sta CODE ENDS,S_SEG SEGMENTSTA DB 200 DUP(?)top equ size sta;或 top equ length sta S_SEG ENDS C_SEG SEGMENTASSUME CS:C_SEG,SS:S_SEG START:MOV AX,S_SEGMOV SS,AXMOV SP,TOP CODE ENDS,ORG规定了段内
37、的指令或数据存放的开始地址(偏移地址的初值),其格式为:ORG 表达式的值即为开始地址,从此地址起连续存放程序或数据。 例: ABC SEGMENTORG 100Hbegin: ABC ENDS,(三)、ORG伪指令,指令从100H开始存放,4.3.4 过程定义伪指令PROC、ENDP,过程就是子程序。一个过程可以被其它程序所调用(用CALL指令),过程的最后一条指令一般是返回指令(RET)过程定义伪指令的格式为PROC 类型 RETENDP注意:PROC和ENDP必须成对出现。,过程的类型有两种:NEAR(默认类型)表示段内调用FAR表示段间调用 调用一个过程的格式为:CALL ,4.3.5
38、 宏定义伪指令,如果需要多次使用同一个程序段,可以将这个程序段定义为一个”宏指令”,然后在需要时,可简单地用宏指令名来代替这个程序段。,指令的格式为:MACRO 形参表ENDM,例:两个数之和的宏定义和宏调用。宏定义为: DADD MACRO X,Y,ZMOV AX,XADD AX,YMOV Z,AXENDM,X、Y、Z是形式参数。调用宏DADD时可写为:DADD DATA1,DATA2,SUM DATA1,DATA2,SUM是实际参数,由它们替换定义中的X、Y、Z。,宏调用与过程(子程序)调用都是一次定义,多次调用。它们之间的差别是: 执行形式:宏命令伪指令由宏汇编程序在汇编过理中进行处理,
39、而CALL、RET则是由CPU执行的指令。 汇编结果:宏命令伪指令汇编后被展开。 执行速度:宏命令执行速度较快(因无调用转移) 占用内存:宏指令简化了源程序,但不能简化目标程序,并不节省内存单元。使用过程可以节省代码占用的内存空间。,宏展开:汇编程序会把宏调用按宏定义展开。 例如:宏定义为:Display MACRO stringLEA DX,stringMOV AH,9INT 21HENDM程序中宏调用:DISPLAY ERROR_MESSAGEDISPLAY EXIT_MESSAGE汇编后的结果:(带有+号的指令为宏展开后的结果)+ LEA DX,ERROR_MESSAGE+ MOV AH
40、,9+ INT 21H+ LEA DX,EXIT_MESSAGE+ MOV AH,9+ INT 21H,4.3.6 模块连接伪指令,用于模块之间的共享信息。 即A模块中的变量和标号被B模块使用时必须加以说明,一、PUBLIC;本模块说明,格式:PUBLIC 符号名1 ,符号名2,功能:公共引用,说明本模块定义,其它模块引用的共享信息。,二、EXTRN;引用外模块的说明(external),格式:EXTRN 符号名:类型,符号名:类型,功能:其他模块定义的,本模块引用。,NAME A EXTRN VAR2:WORD,LAB2:FAR PUBLIC VAR1,LAB1,VAR4 DATA1 SEG
41、MENTVAR1 DB 12H,34HVAR3 DW 10 DUP(?)VAR4 DW 10 DUP(?) DATA1 ENDS,NAME B EXTRN VAR1:BYTE,VAR4:WORD PUBLIC VAR2 DATA2 SEGMENTVAR2 DW 0VAR5 DB 5 DUP(0) DATA2 ENDS,NAME C EXTRN LAB1:FAR,VAR5:BYTE PUBLIC LAB2,存储模式决定了一个程序的规模,也确定了子程序调用、指令转移和数据访问等的缺省属性 当使用简化段定义的源程序格式时,必须有存储模式.MODEL语句,且位于所有简化段定义语句之前。其格式为:.MO
42、DEL 存储模式 .MODEL语句确定了程序采用的存储模式,MASM有7种可以选择,4.3.7 存储模式(Memory Model),2. 逻辑段的简化定义,.STACK 大小 ;堆栈段定义伪指令.STACK创建一个堆栈段,段名是:STACK。可选的“大小”参数指定堆栈段所占存储区的字节数,默认是1KB(1024400H字节) .DATA ;数据段定义伪指令.DATA创建一个数据段,段名是:_DATA。数据段名可用DATA预定义标识符表示 .CODE 段名 ;代码段定义伪指令.CODE创建一个代码段,可选的“段名”参数指定该代码段的段名。如果没有给出段名,则采用默认段名,一个段的开始自动结束前
43、面的一个段简化段定义伪指令之前,需有存储模式语句,3. 程序开始,为了指明程序开始执行的位置,需要使用一个标号(例题中采用了start标识符) 连接程序会根据程序起始点正确地设置CS和IP值,根据程序大小和堆栈段大小设置SS和SP值 连接程序没有设置DS和ES值。程序如果使用数据段或附加段,必须明确给DS或ES赋值 大多数程序需要数据段,程序的执行开始应是:start: mov ax,data ;data表示数据段的段地址mov ds,ax ;设置DS,4. 程序终止,应用程序执行结束,应该将控制权交还操作系统 汇编语言程序设计中,有多种返回DOS的方法,但一般利用DOS功能调用的4CH子功能
44、实现,它需要的入口参数是AL返回数码(通常用0表示程序没有错误) 于是,应用程序的终止代码就是:mov ax,4c00hint 21h,5. 汇编结束,汇编结束表示汇编程序到此结束将源程序翻译成目标模块代码的过程 源程序的最后必须有一条END伪指令END 标号 可选的“标号”参数指定程序开始执行点,连接程序据此设置CS和IP值(例题中采用了start标识符),不要糊涂 程序终止和汇编结束是两码事,第一个源程序文件wjl301.asm,;wjl301.asm.model small.stack.data string db Hello, Assembly !,0dh,0ah,$.code sta
45、rt: mov ax,datamov ds,axmov dx,offset stringmov ah,9int 21hmov ax,4c00hint 21hend start,简化段定义的源程序格式,.model small ;小型模式存储模式.stack ; 1KB空间堆栈段.data ;数据段 ;数据定义.code ;代码段 start: mov ax,data ;起始点mov ds,ax ;设置DS ;程序代码mov ax,4c00hint 21h ;结束点,返回DOS ;子程序代码end start ;汇编结束,完整段定义格式,完整段定义利用SEGMENT和ENDS一对伪指令定义逻辑段
46、 同时需要配合ASSUME伪指令指明逻辑段是代码段、堆栈段、数据段还是附加段 完整段定义的优势是可以指明逻辑段的定位、组合、类别等属性;而简化段定义只能采用系统默认的属性 完整段定义和简化段定义的实质是一致的,2.汇编汇编就是用宏汇编程序MASM.EXE把汇编语言源程序翻译(汇编)成机器语言的目标程序。宏汇编程序主要有以下功能: 检查源程序中语法错误,给出错误信息; 展开宏指令; 生目标程序(.OBJ),列表文件(.LST)和交叉引用文件(.CRF)。,4.3.8 汇编语言上机调试,1.编辑调用编辑程序EDIT.EXE,WS.EXE等,用键盘敲入源程序,退出编辑系统时,保存编辑完成的文件,且扩
47、展名为.ASM。,接着屏幕上显示:,宏汇编程序询问汇编产生的目标程序文件(目标程序文件是一个纯二进制代码文件,不能直接在屏幕上显示观察)的文件名是否为方括号中的默认值(即目标程序与源程序同名)。若是,直接按一回车键,否则需自己输入另一文件名。在回答完这一询问后,宏汇编程序接着依次询问产生列表文件(列表文件.LST是一个很有用的文件,文件中包含了源程序中各语句及其对应的目标代码。给出了源程序中各语句所属段内的偏移量,并且把源程序中所用的标号、变量和符号,列出它们的名字、类型和值,便于查阅)和交叉引用文件(交叉引用文件中给出了源程序中定义的符号如标号、变量等以及程序中引用这些符号的情况,且是按字母顺序排列的。若要查看这个符号表,必须使用CREF软件,它根据.CRF文件建立一个扩展名为.REF的文件。然后再显示.REF文件的内容就可以看到这个符号表)的文件名,屏幕上显示:,这两个文件是否建立由操作人员确定:若要建立其中一个或两个,操作人员便可输入所需建立的文件名,否则直接送入回车键。待完成上述人机对话后,宏汇编程序便对源程序进行扫描,检查源程序中各语句是否有语法错误,同时把各语句汇编成对应的机器目标代码。在汇编过程中,若发现源程序有语法错误,便随时给出出错信息。屏幕上显示:,