§4.7 汇编程序(MASM)
本节概述:
汇编程序的作用:
汇编语言源程序文件(ASM)->目标程序文件(OBJ)。
输入:ASM文件。
输出:OBJ文件 + 输出列表文件(LST)+ 交叉引用文件(CRF)。
当源程序无语法错误时,生成OBJ文件。
可选择是否生成LST和CRF文件。
教学目标
掌握或了解汇编的过程,掌握MASM的用法,了解相关的问题。
学习内容:
MASM的用法
汇编过程
相关问题
重点难点
汇编过程。
学习方法
掌握或了解汇编的过程,掌握MASM的用法,了解相关的问题。
关键字
汇编过程
参考资料
1、《微型计算机技术及应用》,戴梅萼等编著,第二版,清华大学出版社
2、《微型计算机原理》,季维法等编著,第一版,电子科技大学出版社
3、《微型计算机原理—常见题型解析及模拟题》,武自芳主编,西北工业大学出版社
4、《80X86/80X87汇编语言程序设计》,洪志全等编著,电子科技大学出版社
§4.7.1 MASM的用法
以汇编TEST.ASM文件为例。
用法一:
H:\961234>masm↙
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
Source filename [.ASM]: test↙ ;输入源程序文件名(扩展名可省略)
Object filename [test.OBJ]: ↙;缺省目标文件名为TEST.OBJ
Source listing [NUL.LST]: ↙;不生成LST文件,直接回车
Cross-reference [NUL.CRF]: ↙;不生成CRF文件,直接回车
51470 + 435154 Bytes symbol space free
0 Warning Errors ; 0个警告错误
0 Severe Errors ;0个严重错误
如果汇编程序能够翻译源程序,报告"0个警告错误"、"0个严重错误",同时,生成目标文件TEST.OBJ。
用法二:
H:\961234>masm test; //后接分后
输入为test.asm,输出为test.obj,不生成LST和CRF文件。
用法三:
H:\961234>masm test,,,, //后接四个逗号
输入为test.asm,输出为test.obj,test.lst,test.crf。
1、 目标文件OBJ
汇编程序MASM把源程序中的指令翻译为机器码,存入OBJ文件中。如果源程序中有语法错误,则不能生成OBJ文件。应修改语法错误,重新汇编,直到没有任何语法错误、生成OBJ文件为止。
2、 列表文件LST
该文件列出指令及其对应的机器码。如果源程序中有语法错误,错误信息也写入LST文件中。
3、 交叉引用文件CRF
该文件中包含标识符(段名、过程名、变量名、标号)在源程序中定义的位置和被引用的位置。
CRF是二进制文件,可以使用实用程序CREF.EXE将其转换为文本文件REF。
H:\961234>CREF test; //后接分号
§4.7.2 汇编过程
汇编程序MASM使用"机器指令表"和"伪指令表",把源程序文件ASM翻译为目标文件OBJ。
1、 机器指令表
机器指令表是一张固定的表格,给出所有助记符指令与机器指令的对应关系。
如: MOV DS,AX → 8E,D8
MOV AX,4C00H→B8,00,4C
INT 21H→CD 21
2、 伪指令表
伪指令表给出全部伪指令。
3、 两遍扫描
汇编程序MASM对源程序文件ASM执行两遍扫描,根据"机器指令表"和"伪指令表"把ASM文件翻译为OBJ文件。
第一遍扫描:
任务:
(1) 语法检查。
(2) 确定每一行源程序的段内偏移地址,并记录员程序定义的符号的偏移地址,形成一张"符号表"。
进行语法检查时,首先读入一个源程序语句,查找"伪指令表",检查该语句是不是伪指令,如是伪指令,执行该伪指令规定的操作。若该语句不是伪指令,查找"机器指令表",检查该语句是不是机器指令。若读入的语句既不是伪指令、也不是机器指令,表明源程序出现了语法错误,在屏幕上显示出错位置及错误原因,同时把错误信息写入LST文件(如果要生成LST文件)。
汇编程序MASM使用"地址计数器"来确定每一行源程序的段内偏移地址。开始汇编时,或在每一个"段"(SEGMENT)开始时,地址计数器的值初始化为0。每处理一条指令,地址计数器的值就增加一个值,该值等于该指令对应的机器指令的长度。
如果所处理的语句是伪指令DB、DW、DD、DT,则地址计数器增加的值等于这些伪指令定义的存储区长度。
如果所处理的语句定义了符号,则把该符号名、属性(过程的属性有FAR、NEAR,变量的属性有Byte、Word、DWord)、对应的地址计数值写入"符号表"。
第一遍扫描(PASS1)的主要流程如图1:
第二遍扫描:
第二遍扫描时,根据"符号表"、"机器指令表"、"伪指令表",把汇编语言指令翻译为机器指令,完成汇编任务,生成OBJ、LST、CRF文件。
第二遍扫描的流程:
在第二遍扫描时,如有"表达式",如:
MOV AX,3*2
DB 4+5 则MASM将计算表达式的值。
§4.7.3 相关问题
1、 前向引用(提前引用、向前引用)
在汇编语句的操作数字段中,若出现变量或符号,有两种情况:如果该变量或符号已经定义过,称为"后向引用"; 如果该变量或符号尚未定义,称为"前向引用"。
汇编程序MASM在翻译"JMP NEXT"指令时,若NEXT已定义,MASM已知NEXT与JMP的距离,可以正确计算"JMP NEXT"指令的长度,产生正确的机器指令。
汇编程序MASM在翻译"JMP NEXT"指令时,若NEXT未定义(前向引用),MASM不知道NEXT与JMP的距离,此时,MASM假定它们在同一段,且假定其距离大于-128~+127,即产生机器码:
EA XXXX
偏移量
MASM的假定有时不符合程序的实际情况,则产生错误的机器码,为了避免这种情况,在编写程序时,如果有前向引用,应指明引用的属性(距离)。
如:
JMP SHORT NEXT ;(无PTR)
JMP NEAR PTR NEXT
JMP FAR PTR NEXT
注意:
(1) "JMP NEXT"与"JMP NEAR PTR NEXT"相同。
(2) 一般不区分"JMP SHORT NEXT"与"JMP NEAR PTR NEXT",因为把"JMP SHORT NEXT"处理为"JMP NEAR PTR NEXT"只是增加了机器指令的长度,不会使执行结果出现错误。因此,程序中只区分"段间转移"和"段内转移"。即, 出现段间转移时,使用"JMP FAR PTR NEXT",否则,使用"JMP NEXT"。
(3)对于CALL指令,有类似概念。
段间调用: CALL FAR PTR SUBP
段内调用:CALL SUBP
(4)对于条件转移(JZ、JC、JP等)和循环控制指令(LOOP、LOOPZ、LOOPNE等),转移的距离只能在-128~+127之间,不需要SHORT、NEAR PTR修饰,不允许出现FAR PTR。
(5)一般,把数据段放在代码段之前,避免出现前向引用。
2、 浮动地址的概念
在汇编过程中,每个源程序段开始时,均把"地址计数器"清0,其后本段内所有地址均为相对于起始地址的偏移量,把这些段组合成一个可执行文件EXE(由连接程序LINK.EXE组合)时,除EXE中第一个段外,每个段的起始地址均要在0的基础上"浮动"一个值,即,把所有地址变为相对于第一个段起始地址(其值为0)的偏移量。因此,汇编程序翻译后,各符号的地址称为"浮动地址"。在LST文件中,浮动地址以R标记(Relocation),如图4-14所示。
(1) "MOV AX, DATA"。由于DATA是段地址,MASM把其起始地址设为0,LINK把DATA、CODE段组合成EXE文件时,DATA的值需重新定位,故DATA是浮动地址,LST 文件中,把"MOV AX, DATA" 的机器码标记为"B8 __R"。
(2) "MOV CX, count"。MASM已知count的地址为006F,该指令被翻译为"8B 0E 006F",但count的地址仍是浮动地址,也以R标记。
§4.8 连接程序(LINK)
本节概述:
汇编得到的OBJ文件是源程序对应的机器码,但该文件不能直接运行,因为OBJ文件中,各段是独立的,它们的起始地址均被设为0,各段没有形成一个整体。连接程序LINK把OBJ文件中的各段连接成一个整体:EXE文件。
教学目标
掌握连接的基本用法和它的功能及其过程。
学习内容:
基本用法
功能
连接过程
重点难点
连接的基本用法和它的功能及其过程。
学习方法
掌握连接的基本用法和它的功能及其过程。
关键字
连接
参考资料
1、《微型计算机技术及应用》,戴梅萼等编著,第二版,清华大学出版社
2、《微型计算机原理》,季维法等编著,第一版,电子科技大学出版社
3、《微型计算机原理—常见题型解析及模拟题》,武自芳主编,西北工业大学出版社
4、《80X86/80X87汇编语言程序设计》,洪志全等编著,电子科技大学出版社
§4.8.1 基本用法
连接程序LINK把OBJ文件(一个或多个OBJ文件)中的各段连接成一个整体:EXE文件,其输入是OBJ文件和LIB文件(库文件,一种特殊的OBJ文件),输出是EXE文件,也可以输出映像文件MAP。
是否输出MAP文件是可选的。
仅连接过程无错误时才能生成EXE文件,否则,不能生成EXE文件。
用法1:
H:961234>link↙
Microsoft (R) Overlay Linker Version 3.60
Copyright (C) Microsoft Corp 1983-1987. All rights reserved.
Object Modules [.OBJ]: test↙ 输入目标文件名(扩展名可省略)
Run File [TEST.EXE]: ↙ 缺省可执行文件名为TEST.EXE
List File [NUL.MAP]: ↙ 不生成MAP文件
Libraries [.LIB]: ↙ 无库文件输入
用法2:
H:961234>link test,,,,↙ 后接四个逗号
不出现上述提示,输入test.obj,生成可执行文件test.exe和映像文件test.map,无库文件输入。
用法3:
H:961234>link test;↙ 后接分号 不出现上述提示,输入test.obj,生成可执行文件test.exe,不产生映像文件test.map,无库文件输入。
§4.8.2 功能
1、 功能
总体上说,连接程序LINK的功能是把OBJ文件(一个或多个OBJ文件)中的各段连接成一个整体:EXE文件。具体功能为:
(1)为所有段分配存储空间,确定各段相对于第一个段的起始地址的地址偏移量。
汇编程序MASM把各段的起始地址均设为0,把这些段连接为一个整体EXE文件时,需确定各段相对于第一个段的起始地址的地址偏移量。如确定"MOV AX,DATA"指令中DATA代表的值。
(2)确定汇编程序MASM不能确定的偏移地址,包括:
① 浮动地址,如count的地址。
② 外部符号的地址。
2、外部符号
在模块化程序设计中,可以把一个大型程序的源程序存放为几个源程序文件,每个文件称为一个源程序"模块"。每个源程序模块被汇编程序MASM翻译为独立的OBJ文件(OBJ模块),连接程序LINK把这些OBJ模块连接为一个EXE文件。
在某个源程序模块中,可以引用另一个源程序模块中定义的符号(标号、过程名、变量)。这些符号不在本源程序模块中定义,而在另一个源程序模块中定义,称为"外部符号"。 汇编程序MASM在翻译某源程序模块时,不能确定外部符号的地址,外部符号的地址有连接程序LINK来确定。
3、 库文件
库文件是一种特殊的OBJ文件。在程序设计中,可以把一些常用的程序段设计为子程序(过程),用汇编程序MASM把它们翻译为OBJ文件,然后由库管理程序LIB.EXE生成库文件LIB。以后需使用某子程序时,直接调用,不必写出这些子程序的代码。由连接程序LINK把这些代码加入可执行文件EXE中。
§4.8.3 连接过程
连接程序LINK对所有OBJ模块扫描两遍。
第一遍扫描对所有段分配段地址,并建立一张"外部符号表"(又称"全局符号表"),记录外部符号的地址和属性。
第二遍扫描确定与外部符号有关的机器指令,并创建"文件头"(文件头包含操作系统把EXE文件从磁盘调入内存所需的信息)。