汇编(六)——汇编语言程序格式及MASM

来源:互联网 发布:鲜芋仙什么最好吃知乎 编辑:程序博客网 时间:2024/05/18 03:25
编语言的实现也是先利用某种编辑器编写汇编语言源程序(*.ASM),然后经过汇编得到目标模块文件(*.OBJ)、连接后形成可执行文件(*.EXE)。

 

1、汇编语言程序的语句格式
汇编语源程序由语句序列构成。语句一般由分隔符分成的四个部分组成,它们有两种格式:
(1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:
标号:硬指令助记符  操作数,操作数      ;注释
(2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:
名字  伪指令助记符  参数,参数,...     ;注释
◆执行性语句中,冒号前的标号反映该指令的逻辑地址;说明性语句中的名字可以是变量名、段名、子程序名或宏名等等,既反映逻辑地址又具有自身的各种属性。标号和名字很容易通过是否具有冒号来区分。
◆硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令,伪指令助记符主要完成一些不产生CPU动作的说明性工作,在程序执行前由汇编程序完成处理。
◆处理器指令的操作数可以是立即数、寄存器和存储单元。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号隔开。
◆语句中由分号开始的部分是注释。
2、汇编语言源程序
这个以前已经学过,主要有简化段定义格式和完整段定义格式
3、宏汇编程序MASM
MASM6.11,安装文件5张软盘,默认安装在C:/MASM目录下,完整的MASM汇编系统包含很多文件,但最基本的有如下几个:
ML.EXE       汇编程序
ML.ERR       汇编错误信息文件
DOSXNT.EXE   MS-DOS扩展文件
LINK.EXE     连接文件
LIB.EXE      子程序库管理文件
如果采用集成开发环境PWB,主要涉及如下文件:
PWWB.EXE           程序员工作平台
NMAKER.EXE         工程维护程序
NMAKE.EXE          nmaker的MS-DOS扩展驱动程序
CV.EXE             源代码调试器CodeView
CVPACK.EXE         调试信息压缩器,它为CODEVIEW准备一个可执行文件
HELPMAKE.EXE       帮助文件维护程序
BSCMAKE.EXE        浏览数据库创建程序
SBRPACK.EXE        浏览信息程序
PWBRMAKE.EXE       BSCMAKE兼容驱动程序
*.MXT              各种PWB扩展工具文件
*.XXT              各种语言的PWB扩展文件
4、汇编语言的命令行开发过程
(1)原程序的编写
用编辑软件书写*.asm源程序,如
LI6-1.ASM
;LI6-1.ASM
 .MODEL SMALL
 .STACK
 .DATA
STRING DB 'Hello,Everybody!'
 .CODE
 .STARTUP
 MOV DX,OFFSET STRING
 MOV AH,9
 INT 21H
 .EXIT 0
 END
(2)原程序的汇编
汇编是将原程序翻译成由机器代码组成的目标模块文件的过程,如下:
ML /c LI6-1.ASM
如果源程序没有语法错误,则生成一个目标模块文件LI6-1.OBJ
(3)目标文件的连接
连接程序能把一个或多个目标文件和库文件和成一个可执行文件(.EXE、.COM文件),如下:
LINK LI6-1.OBJ
连接程序的一般格式:
LINK [/参数选项] OBJ文件列表 [EXE文件名,MAP文件名,库文件][;]
连接程序可以将多个模块文件连接起来,形成一个可执行文件;多个模块文件用“+”分隔。给出EE文件名就可以替代与第一个模块文件名相同的缺省名。给出MAP文件名将创建连接映像文件,否则不生成映像文件。库文件是指连接程序需要的子程序库等。“;”表示采用缺省值
事实上,ML汇编程序可以自动调用LINK连接程序(ML表示MASM和LINK),实现汇编和连接依次进行,如下即可完成可执行文件的生成:
ML LI6-1.ASM
ML的命令行格式如下:
ML [/参数选项] 文件列表 [/LINK连接参数选项]
参数选项如下(注意参数是大小写敏感的):
/AT——允许tiny存储模式(创建一个COM文件)
/c——只汇编源程序,不进行自动连接
/fl 文件名——川建一个汇编列表文件(扩展名LST)
/Fr 文件名——创建一个可在PWB下浏览的.SBR源浏览文件
/Fo 文件名——根据指定的文件名生成模块文件,而不是采用缺省名
/Fe 文件名——根据指定的文件名生成可执行文件,而不是采用缺省名
/Fm 文件名——创建一个连接映像文件(扩展名MAP)
/I 路径名——设置需要包含进(INCLUDE)源程序的文件的所在路径
/Sg——在生成的文件列表文件中,列出由汇编程序产生的指令
/Sn——在创建列表文件时不产生符号表
/Zi——生成模块文件时,加入调试程序CODEVIEW需要的信息
/Zs——只进行语法检查,不产生任何代码
/LINK——传递给连接程序LINK的参数
列表文件是一种文本文件,含有源程序和目标代码,创建列表文件,输入如下命令:
ML /Fl /Sg LI6-1.ASM
该命令除产生模块文件LI6-1.OBJ和可执行文件LI6-1.EXE,还产生列表文件LI6-1.LST,采用/Sg,如果源程序具有.STARTUP、.EXIT伪指令以及流程控制伪指令.IF、.WHILE等,将在列表文件中得到相应的硬指令;否则列表文件只给出上述伪指令。LI6-1.LST如下:

li6-1.lst
Microsoft (R) Macro Assembler Version 6.11      08/10/05 14:09:13
li6-1.asm           Page 1 - 1


    ;LI6-1.ASM
     .MODEL SMALL
     .STACK
 0000     .DATA
 0000 48 65 6C 6C 6F 2C  STRING DB 'Hello,Everybody!'
       45 76 65 72 79 62
       6F 64 79 21
 0000     .CODE
     .STARTUP
 0000      *@Startup:
 0000  BA ---- R    *     mov    dx, DGROUP
 0003  8E DA     *     mov    ds, dx
 0005  8C D3     *     mov    bx, ss
 0007  2B DA     *     sub    bx, dx
 0009  D1 E3     *     shl    bx, 001h
 000B  D1 E3     *     shl    bx, 001h
 000D  D1 E3     *     shl    bx, 001h
 000F  D1 E3     *     shl    bx, 001h
 0011  FA     *     cli   
 0012  8E D2     *     mov    ss, dx
 0014  03 E3     *     add    sp, bx
 0016  FB     *     sti   
 0017  BA 0000 R   MOV DX,OFFSET STRING
 001A  B4 09    MOV AH,9
 001C  CD 21    INT 21H
     .EXIT 0
 001E  B8 4C00     *     mov    ax, 04C00h
 0021  CD 21     *     int    021h
     END
Microsoft (R) Macro Assembler Version 6.11      08/10/05 14:09:13
li6-1.asm           Symbols 2 - 1

 


Segments and Groups:

                N a m e                 Size     Length   Align   Combine Class

DGROUP . . . . . . . . . . . . . GROUP
_DATA  . . . . . . . . . . . . . 16 Bit  0010   Word   Public  'DATA' 
STACK  . . . . . . . . . . . . . 16 Bit  0400   Para   Stack   'STACK' 
_TEXT  . . . . . . . . . . . . . 16 Bit  0023   Word   Public  'CODE' 


Symbols:

                N a m e                 Type     Value    Attr

@CodeSize  . . . . . . . . . . . Number  0000h 
@DataSize  . . . . . . . . . . . Number  0000h 
@Interface . . . . . . . . . . . Number  0000h 
@Model . . . . . . . . . . . . . Number  0002h 
@Startup . . . . . . . . . . . . L Near  0000   _TEXT 
@code  . . . . . . . . . . . . . Text     _TEXT
@data  . . . . . . . . . . . . . Text     DGROUP
@fardata?  . . . . . . . . . . . Text     FAR_BSS
@fardata . . . . . . . . . . . . Text     FAR_DATA
@stack . . . . . . . . . . . . . Text     DGROUP
STRING . . . . . . . . . . . . . Byte  0000   _DATA 

    0 Warnings
    0 Errors

◆列表文件有两部分内容。在第一部分源程序中,最左列是数据或指令在该段从0开始的相对偏移地址,向右依次是指令的机器代码字节个数、机器代码和汇编语言语句。机器代码后有字母"R"表示该指令的立即数/位移量现在不能确定或是只是相对地址,它将在程序连接或进入主存时才能定位。带有“*”的处理器指令是由前面一条伪指令产生的,采用/Sg选项时的列表文件才罗列。如果陈序中有错误(ERROR)或警告(WARMING),也会会在相应位置提示。
列表文件的第二部分是标示符使用情况。对段名和组名给出他们的名字(NAME)、尺寸(Size)、长度(Length)、定位(Align)、组合(Combine)和类别(Class)属性;对符号给出他们的名字、类型(Type)、数值(Value)和属性(Attr)。采用简化段定义格式,有许多汇编系统的预定义标示符,例如@DATA等。
◆映像文件也是一种文本文件,含有每段在存储器中的分配情况。如下命令创建:
ML /Fm LI6-1.ASM
将产生LI6-1.MAP映像文件,如下:

LI6-1.MAP
Start  Stop   Length Name                   Class
 00000H 00022H 00023H _TEXT                  CODE
 00024H 00033H 00010H _DATA                  DATA
 00040H 0043FH 00400H STACK                  STACK

 Origin   Group
 0002:0   DGROUP

  Address         Publics by Name


  Address         Publics by Value


Program entry point at 0000:0000

映像文件中首先给出了该程序各个逻辑段的起点(Start)、终点(sTOP)、长度(Length)、段名(Name)和类别(Class);然后是段组(GROUP)位置和组名;最后提示程序开始执行的逻辑地址。注意,这里的起点、终点和段地址是以该程序文件开头而言的相对地址,实际的绝对地址需要在程序进入主存后确定。

5、可执行程序的调试
只要在操作系统下输入文件名即可:
LI6-1
操作系统装在该文件进入主存,开始运行,是用DEBUG调试时:
DEBUG LI6-1.EXE
其中,BX.CX反映程序的大小,CS:IP指向程序开始执行的第一条指令,SS:SP指向堆栈段,DS和ES并不指向程序数据段,而是指向程序前100H处(这部分是该程序的短前缀PSP);所以,DS和ES应该在程序当中进行设置,正如该程序.STARTUP伪指令所完成的。采用简化段定义格式的程序,在主存中从低到高依次安排代码段、数据段和堆栈段。

可以使用以上的方法汇编上次的3个数据传送指令源程序

 
原创粉丝点击