手机版 | 登陆 | 注册 | 留言 | 设首页 | 加收藏
当前位置: 网站首页 > 软件工程 > 汇编语言 > 文章 当前位置: 汇编语言 > 文章

二种常用的汇编语言编程环境

时间:2023-12-20    点击: 次    来源:网络    作者:佚名 - 小 + 大


http://www.weijiyuanli.cn/web/huibianjiaocheng/Appendix/App1-1.htm


学习汇编语言的目的就是要用汇编语言编程来解决实际问题,下面介绍二种常用的汇编语言编程环境:宏汇编MASM 6.11Turbo Assember

1.1、宏汇编MASM系统

在宏汇编MASM系统中,程序员可用二种方法来处理源程序:命令行和集成环境。

1.1.1 命令行命令

1、编写源程序

可用计算机系统中各种能编辑文本文件的编辑器来编辑汇编源程序。常用的编辑器有:EDIT、Q、Word、记事本和写字板等。源文件的后缀为:ASM

2、汇编程序

当源程序编写好后,可用MASM命令来汇编该源程序。如果源程序没有语法错误,那么,将生成目标文件(OBJ文件),为最终生成可执行文件作准备,但如果源程序有错误,汇编程序将显示出错误位置和原因,也可用列表文件(LST文件)来查看出错位置和原因。

下面给出一些使用该命令的实例情况。

例1.1 查看MASM命令的功能。(其中:用户输入的命令用下划线,系统显示的内容没有下划线。以下与此相同)

…>masm /?
usage: masm/options source(.asm),[out(.obj)],[list(.lst)],[cref(.crf)][;]
……

常用的选项有:/Zi/Zd,因为它们与符号跟踪有关。

例1.2 用MASM命令汇编源程序

…>masm test
Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1993.  All rights reserved.
Invoking: ML.EXE /I. /Zm /c test.asm
Microsoft (R) Macro Assembler Version 6.11
Copyright (C) Microsoft Corp 1981-1993.  All rights reserved.
Assembling: test.asm

如果MASM命令显示了类似如上的处理结果,那么,表示源文件TEST.ASM已成功汇编,并已生成了其目标文件TEST.OBJ。

例1.3 用MASM命令汇编源程序

…>masm test
……
Assembling: test.asm
test.asm(10): error A2070: invalid instruction operands

如果MASM命令显示了类似如上的处理结果,那么,表示源文件有错,没有生成其目标文件。在本例中,显示第10行有语法错:非法的指令操作数。这时,要用编辑器阅读源程序的第10行,看看输入指令时是否有误。

假如源程序有许多错误,很难记住全部出错位置,那么,可用列表文件来辅助查错。

例1.4 在汇编源程序的同时,生成其列表文件。

…>masm test, ,test
……
Assembling: test.asm
test.asm(10): error A2070: invalid instruction operands

列表文件TEST.LST是一个文本文件,可用编辑器直接阅读,并可看出其错误的位置和原因。下面是一个列表文件的实例。

…>edit test.lst

Microsoft (R) Macro Assembler Version 6.11   08/26/00 18:42:57


test.asm
Page 1 - 1
.model  small
.486
0000 .data
.radix 7
0000 2A 08 0F w2 db 60,11,18    ;0000是偏移量,2A 08 0F是数据
0003 000A 0009 w1 dw 10T, 1001B  ;0003是偏移量,000A 0009是数据
0000 .code

.startup
mov dl, 7777h
test.asm(10): error A2070: invalid instruction operands

mov ax, dx
0012  0F A4 C2 01 shld dx, ax, 1
0016  D1 D0 rcl  ax, 1
.exit 0
end

在此后面还有其它内容,但它们对查错没有帮助,所以,在此省略。

3、连接程序

当由源文件汇编成功后,即可用连接程序(LINK.EXE)生成其可执行文件。

例1.5 查看连接程序(LINK.EXE)的具体选项。

…>link /?
LINK <objs>,<exefile>,<mapfile>,<libs>,<deffile>
Valid options are:
……

常用的功能选项有:/?/HELP/CODEVIEW/STACK 

例1.6 用连接程序生成执行文件。

方法1:

…>link test
……
Run File [test.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment

这种方法需要确认连接过程中的各种文件名,如果使用文件名的默认值,那么直接按“回车”键即可。

在上面四个文件名中,最重要二个文件名是:执行文件名和库文件名。一般情况下,无需更换最终生成的执行文件名;如果在连接过程中需要其它的库文件,则在显示第三行提示时,输入所需要的库文件名。

最后一行显示一个警告信息,提出本程序没有定义堆栈段,该警告信息可以不必理会,因为该执行文件是可运行的,在操作系统装入时会自动为其添加一个默认的堆栈段。

方法2:在文件名后面加上分号“;”,默认使用各类文件的缺省值。

…>link test;
……
LINK : warning L4021: no stack segment

4、运行程序

当要运行所生成文件时,可直接输入其文件名即可。

…>test

5、符号调试程序

当程序的运行结果不是预期结果时,就需要调试程序,找出错误的语句或逻辑关系。MASM系统提供了可用于源程序一级的调试工具CV(CodeView)。有关CV的使用参见“调试工具”中CodeView的介绍。

例1.7 用符号调试工具CV来调试程序TEST.ASM所生成可执行文件。

…>masm /Zi /Zd test    ;假设其没有语法错
…>link /Co test
…>cv test.exe


1.1.2 编程集成环境PWB

PWB(Programmer's WorkBench)是MASM 6.11提供的集成环境。在此环境下,程序员可直接编写源程序、汇编、连接和运行。

在汇编源程序时,如果有错误,系统将列举出所有出错位置和出错原因。还可用Shife+F3Shife+F4进行错误定位;
在连接时,可指定堆栈的大小、附加的库文件、符号跟踪等选项;
在运行时,可设置命令行参数、直接运行、按调试方式运行、用DOS命令来运行等。

例1.8 查看PWB的启动方式

…>pwb /?
Microsoft (R) Programmer's WorkBench  Version 2.1.49
Copyright (c) Microsoft Corp 1992. All rights reserved.
Usage: PWB [<options>] [<files>]
……

通常情况下,在PWB后面跟一个将要编辑的源文件名。假如要编辑源文件TEST.ASM,那么,可直接输入下面命令:

…>pwb test.asm

1、编辑源文件

PWB的编辑功能与许多编辑器的功能类似,有:建立新文件、保存文件、另存为、光标移动功能、块操作、插入/删除操作、恢复操作、查找/替换操作、设置编辑器的功能键和各类颜色等。

要想了解更全面的编辑功能,可查看菜单:FileEditSearchOptions的前四个菜单项。

画面1.1 设置编辑器各类颜色的画面

在画面1.1(Options菜单中的Colors…)中,可选择各类窗口、菜单和文本等对象的背景色和前景色。比如:当要改变源程序的显示颜色时,可先在左边的列表框中选择Text列表项,然后在选择其背景色和前景色文本

2、汇编和连接文件

在集成环境下,源程序的汇编和连接是一次性完成的。当汇编任务结束,且没有错误信息时,连接程序立即开始连接工作。但如果源文件有错,则显示所有错误位置和原因,连接程序不会被执行。在浏览错误信息时,可用Shife+F3Shife+F4进行错误定位。

在连接时,如果需要库文件,那么,可选用Options菜单中的Link Options菜单项来设置,该菜单项的显示画面如画面1.2所示。

画面1.2 连接选项的部分设置画面

在该画面上还可为程序设置一个缺省的堆栈段,其大小也可由用户自行决定。

当生成执行文件需要多个模块连接时,就需要建立一个工程文件(MAK)。建立工程文件的步骤和画面如下:

(1)、输入工程文件名,其默认的后缀为MAK。输入画面如画面1.3所示

画面1.3 建立工程文件名的画面

在画面1.3中还可选择工程目标文件的类型,该类型有:EXE、COM、LIB、Windows的EXE或DLL等二十几种。当然,对每种类型又有一些不同的要求,在此不在进一步展开叙述了。通常情况下,不必选择目标文件类型,其缺省类型就是DOS EXE

(2)、工程文件的编辑

在画面1.3中输入工程文件名,并且按OK按钮时,系统将进入画面1.4,在该画面中可向当前工程中添加源程序,也可把某源程序从当前工程中删除。

画面1.4、编辑工程文件的画面

当输入的文件名不在工程文件中,则把该源文件添加到工程文件中,否则,将其从工程文件中删除。当所有源文件都添加到工程文件中时,可按Save List来保存该工程文件。此后就可用打开工程文件的方式来连接该工程中的文件。

如果需要修改工程文件的话,则可先用Project菜单中的Open Project菜单项打开工程文件,再用Edit Project菜单项来激活画面1.4进行编辑。

3、运行程序

在运行程序时,可设置命令行参数、直接运行、按调试方式运行、用DOS命令来运行等。通常情况下,在编写程序的初期,一般都用调试方式来运行程序。当选用这种方式时,系统会自动进入CV的调试环境。有关CV的使用参见调试工具中CodeView的介绍。

4、符号调试的设置步骤

编写程序很难做到:编辑、汇编、连接、运行一次完成,除非程序的功能非常简单。当运行的结果不符合要求时,就需要跟踪程序的运行。一般来说,跟踪程序执行的工作又称为调试程序,即找出程序中不正常的逻辑关系和语句。

常用的调试手段有二种:执行代码的调试和符号调试。

前者是在没有任何源程序信息的情况下进行调试,其工作难度大、效率低,后者是源程序一级上进行的调试,其目标代码的执行过程就象是源程序的执行,这种调试手段效率高、调试难度低,也是目前最流行的调试手段(各种编程环境下都有类似的调试工具)。

在进行符号调试之前,需要告诉汇编程序和连接程序保留源程序中的各种符号信息。为此,可用下面三步来设置一些命令选项:设置生成选项、设置汇编命令的选项设置连接命令的选项

(1)、设置生成选项

选择Options菜单中的Build Options菜单项,显示出画面1.5,并选择其中的Use Debug Options选项。

画面1.5、设置生成选项的画面

(2)、设置汇编命令的选项

选择Options菜单中的Project Templates→Customize Project Template菜单项,显示出画面1.6。

画面1.6、修改汇编命令选项的画面

在该画面的Build Rule List列表框中选择macro AFLAGS_D “”,并把它修改为macro AFLAGS_D “/Zi /Zd”。

(3)、设置连接命令的选项

选择Options菜单中的Link Options菜单项,与画面1.2所对应的是同一个画面,在此所要的部分画面如画面1.7所示,并选择CodeView选项。

画面1.7、连接过程选项的部分设置画面

经过上面三步设置后,在PWB环境下,用Run菜单中的Debug菜单项就可进行符号调试了。

1.1.3 MASM的安装

宏汇编系统MASM 6.11共有5张软盘:Disk1~Disk5。在Disk1中运行Setup.exe文件即启动系统的安装过程。其安装过程与许多系统的安装大同小异,只有用户根据屏幕提示作适当的选择即可,所以,在此省略系统安装具体步骤的描述。

1.2、Turbo Assember

Turbo Assenmer系统是Borland C++程序设计系统的一部分,可有选择地安装它。该汇编系统的几个主要文件为:TASM.EXE、TLINK.EXE、TD.EXE和TD32.EXE。

TD.EXE是16位程序的调试器,它只能显示16位寄存器,而TD32.EXE是32位程序的调试器。有关其显示画面请参见画面2.2和2.3

Turbo Assenmer系统在汇编语言程序设计方面主要采用命令行的形式,当用其它文本编辑器编写好源程序(后缀为:.ASM)后,即可用TASM和TLINK文件来处理它。

1、汇编源程序

TASM.EXE        ;16-bit real-mode assembler
TASMX.EXE       ;16-bit protected-mode assembler
TASM32.EXE       ;32-bit protected-mode assembler

例1.9 查看TASM的功能选项

…>tasm /?
Syntax:  TASM [options] source [,object] [,listing] [,xref]
/zi,/zd,/zn Debug info: zi=full, zd=line numbers only, zn=none

例1.10 汇编已有源程序TEST.ASM

…>tasm test

假如源文件TEST.ASM有语法错的话,可用下面命令来生成其列表文件TEST.LST。

…>tasm test,,test
…>type test.lst | more

假如源文件没有语法错,那么可用TLINK.EXE连接它,以生成可执行文件。

2、连接程序

例1.11 查看TLINK的功能选项

…>tlink /?
Turbo Link  Version 6.00 Copyright (c) 1992, 1993 Borland International
Syntax: TLINK objfiles, exefile, mapfile, libfiles, deffile, resfiles
@xxxx indicates use response file xxxx
……
/v Full symbolic debug information

例1.12 连接汇编得到的目标文件TEST.OBJ

…>tlink test

3、符号调试程序

当程序的运行结果不是预期结果时,就需要调试程序,找出错误的语句或逻辑关系。Turbo Assember系统提供了可用于源程序一级的调试工具TD/TD32(Turbo Debuger)。

例1.13 用符号调试工具TD来调试程序TEST.ASM所生成可执行文件。

…>tasm /Zi /Zd test      ;假设其没有语法错
…>tlink /v test
…>td test.exe

2、调试工具

2.1、DEBUG

启动DEBUG的一般命令如下:

DEBUG  文件名 [参数表]

其中:文件名指定被调试的文件,其包括名和后缀,参数表是被调试文件运行时所需要的参数。

被调试的文件可以是系统中的任何文件,但通常它们的后缀为EXECOM。当DEBUG启动成功后,将显示连接符“-”,这时,可输入各种命令。

表1 DEBUG中标志位的符号表示

标志名称 溢出OF 方向DF 中断IF 负号SF 零ZF 辅助进位AF 奇偶PF 进位CF
置位状态 OV DN EI NG ZR AC PE CY
复位状态 NV UP DI PL NZ NA PO NC

表2 DEBUG命令及其含义

 命令格式 功能说明
A [地址] 输入汇编指令
C [范围]  起始地址 对由“范围”指定的区域与“起始地址”指定的同大小区域进行比较,显示不相同的单元
D [范围] 显示指定范围内的内存单元内容
E 地址  字节值表 用值表中的值替换从“地址”开始的内存单元内容
F 范围  字节值表 用指定的字节值表来填充内存区域
G [=起始地址]  [断点地址] 从起点(或当前地点)开始执行,到终点结束
H 数值1  数值2 显示二个十六进制数值之和、差
I 端口地址 从端口输入
L [地址 [驱动器号 扇区 扇区数]] 从磁盘读
M 范围  地址 把“范围”内的字节值传送到从“地址”开始的单元
N 文件标识符 [文件标识符…] 指定文件名,为读/写文件做准备
O 端口地址  字节值 向端口输出
P [=地址]  [指令数] 按执行过程,但不进入子程序调用或软中断
Q 退出DEBUG,不保存正在调试的文件
R [寄存器名] 显示和修改寄存器内容
S 范围  字节值表 在内存区域内搜索指定的字节值表。如果找到,显示起始地址,否则,什么也不显示
T [=地址]  [指令数] 跟踪执行,从起点(或当前地点)执行若干条指令
U [范围] 反汇编,显示机器码所对应的汇编指令
W [地址 [驱动器号  扇区 扇区数]] 向磁盘写内容,(BX、CX)为写入字节数

关于参数的几点说明:

1、进制:在DEBUG中输入或显示的数据都是十六进制形式;

2、分隔:命令和参数、参数和参数之间要用空格、逗号或制表符等分隔;

3、地址:用“段值:偏移量”的形式来表示地址,也可用段寄存器来代表“段值”;例如:1000:0,ds:10,cs:30等;

4、范围:用来表示地址范围,从哪个地址开始,到哪个地址结束。它有二种表示方式:

地址 地址——前者表示起始地址,要用“段值:偏移量”来表达,后者表示终止地址,只用“偏移量”来表示;

地址 长度——前者表示起始地址,要用“段值:偏移量”来表达,后者表示该区域的大小,用字母’L’开头的数值来表示

例如:100:50 100——段值为100,偏移量从50到100的内存区域,
100:50 L100——段值为100,偏移量从50开始的100个字节区域。

5、端口地址:二位十六进制数值

6、字节值:二位十六进制数值

7、字节值表:由若干个字节值组成,也可以是用引号括起来的字符串

8、驱动器号:0—驱动器A、1—驱动器B、2—驱动器C、3—驱动器D等

关于使用命令的几点说明:

DEBUG中的提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行
命令是单个字母,命令和参数的大小写可混合输入
可用F1F2F3InsDel和光标移动键等来编辑本行命令
当命令出现语法错误时,将在出错位置显示“^ Error
可用^C^Break来终止当前命令的执行,还可用^S来暂停屏幕显示(当连续不断地显示信息时)

例2.1 启动DEBUG,并装入test.exe文件(假设该文件已存在)。

解: 方法1: 方法2:
…\>debug test.exe …\>debug
-n test.exe
-l

例2.2 比较以DS为段值,偏移量从10到50的内存区域与从地址100:20开始的内存区域。
解:-C DS:10 50 100:20  或  -C DS:10 L41 100:20

例2.3 显示以DS为段值,偏移量从10到50内存区域的单元内容,然后用’abc’来填充它。
解:-D DS:10 50  或  -D DS:10 L41
  -F DS:10 50 'abc'

例2.4 显示十六进制1234与3421之和、差。
解:-H 1234 4321

例2.5 把数据段区域DS:0-40内的内容传送给从附加段ES:10开始的内存中。
解:-M DS:0 40 ES:10

例2.6 在数据段区域DS:0-40内查找是否有字符串'CIH'。
解:-S DS:0 40 'CIH'

2.2、CodeView

CodeView是一个简单、直观的全屏幕调试工具,它可调试多种语言的源程序所生成的执行代码。其常用的调试功能如下所列。

画面2.1 CodeView调试器的显示画面

画面的左上窗口是调试器的主窗口,其显示被调试的源程序或执行代码,左下窗口是命令窗口,用户可输入各种DEBUG命令,右窗口是显示寄存器窗口,它可显示16位和32位寄存器的内容。当然还有其它窗口,如:内存窗口、查看内容窗口(Watch)和程序输出窗口(View)等。

1、功能键

F2: 显示/隐含的寄存器组窗口
F3: 以不同的显示方式显示当前执行的程序
F4: 显示程序的输出屏幕
F5/F7: 执行到下一个逻辑断点,或到程序尾
F6: 依次进入当前屏幕所显示的窗口
F8: 单步执行指令,并进入被调用的子程序
F9: 在源程序行中设置/取消断点,用鼠标左键双击之也可
F10: 单步执行指令,但不进入被调用的子程序

2、命令窗口

在该窗口中,可输入前面介绍的DEBUG命令

3、寄存器组窗口

可以直接在寄存器组窗口内修改各寄存器的内容和各标志位,还可以用Options菜单中的“32-Bit Registers”菜单项来切换16位和32位寄存器。

2.3、Turbo Debuger

Turbo Debuger的主要窗口和调试功能键与CV非常类似,也可以单步执行、设置断点、显示寄存器内容和查看内存内容等。具体操作由读者在实际的调试过程中掌握、体会。

下面给出Turbo Assember系统中,16位和32位调试器的主要显示画面。

画面2.2 TD调试器的显示画面

画面2.3 TD32调试器的显示画面

上一篇:汇编语言入门教程阮一峰版

下一篇:assembly - 位移值对 ModRegRm 字节的 Mod 字段有什么影响?

备案ICP编号  |   QQ:285250603  |  地址:湛江市  |  电话:15322199012  |  
Copyright © 2026 天人文章管理系统 版权所有,授权www.yajiupc.top使用 Powered by 55TR.COM