您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第4章 汇编语言程序设计

第6节 汇编程序(MASM)

 

  §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文件从磁盘调入内存所需的信息)。