[16位语言程序的集成开发]调试器模块的设计与实现

时间:2020-08-29 12:39:14 计算机毕业论文 我要投稿

[16位汇编语言程序的集成开发]调试器模块的设计与实现

Visual Masm 集成开发工具的设计--调试器模块的设计与实现

 

刘永坚  计算机科学与工程学院

 

指导教师  李  晟

 

摘要:本设计主要完成了16位汇编语言程序的集成开发环境Visual Masm的开发,改善现有的各种汇编程序开发环境并增加它们所不具有的功能。本文主要介绍了编译、调试两个功能部分,实现汇编代码的编译、链接、调试等功能,并提供友好的用户界面,为汇编语言的编译、链接、调试提供了可视化的开发环境,并详细介绍了管道管理模块、调试模块、寄存器管理模块。

 

关键词: 汇编 调试器 管道 重定向

 

 

Design and Realization of Debugger in Visual Masm 

 

 

Liu Yong-jian College of Computer Science and Engineering

 

Faculty adviser    Li Sheng

 

 

Abstract: This thesis describes the design and realization odebugger in Visual Masm integrated development environment (IDE) for 16 bits' assembly programming language, it improves the current existing IDE for assembly language and add some new featureThe Visual Masm IDE introduces two core modulescompiler and linker. It provides the functions of compiling, linking and debugging the assembly program, with a friendly user interface, such as the automatic locating of source code with errors. The system described in this thesis was designed for providing a visual integrated development environment for the compiling, linking and debugging of assembly program, and try to describe the detail of the pipe management module, debugging module and registers management module.

 

Key words: assembly language; debugger; pipe; redirection

 

汇编语言是一种低级语言,它具有直接操纵硬件的能力,一直以来在底层开发应用得比较多,比如说在单片机、板卡驱动程序、系统内核等领域。由于汇编语言与具体的机器指令有关,能直接操作硬件(例如:寄存器、端口、内存),而且没有结构化的控制语句,使得汇编语言难学难懂,用汇编语言来开发软件更难。传统的汇编语言开发工具一般是用一般的编辑工具,如:记事本、Edit等文本编辑工具来编写源文件,再在Dos下编译、连接成一个可执行文件。或者用Masm 6.0来开发汇编语言程序。在这两种开发方式中,程序员要负责每一行代码的编写,工作量大又容易出错。这也是每一个汇编语言初学者惧怕汇编语言的一个方面。长期以来汇编语言被认为是一门枯燥难学的语言,在入门时需要记忆大量的指令,而且往往需要对硬件的组成和运行机制有所了解,由于直接与系统底层打交道,要实现的每一部分功能都必须由程序员完全负责实现,哪怕是在高级语言里面看来是一行代码即可实现的最简单的一条语句,到了汇编语言则往往变成需要靠多行指令来完成。要解决这种问题,需要一个优秀的IDE(集成开发环境)来提高使用汇编语言学习和开发软件的效率。Visual Masm是一个集编辑,编译(masm),连接(link),调试(debug)于一体;具有自动初始化代码能力,并提供一些常见操作的开发包,可以自动产生常见操作的汇编语言代码;拥有智能化的编辑环境;具有关键字高亮功能,并可标记行数,记行报错,提供的可视化的调试界面。

 

多线程在各种流行的操作系统中都有实现,是一种是用来实现多种操作的并发执行的机制,它是操作系统代码的运行环境中的最小执行单位,每个进程都必须至少有一个线程,多线程编程在系统编程中属于较为复杂的技术,它涉及到对线程的控制问题。在本次设计中,必须运用多线程编程技术来配合管道技术实现调试模块的功能。

 

要达到捕获其他程序的输出(标准输出stdout、标准错误输出stderr)和向其输入(标准输入stdin)的目的,实际上就是要实现进程间的信息交换,进程之间互相交换信息的工作称之为通信IPCInter Process Communication)。

 

管道是用于进程间通信的一段共享内存,创建管道的进程称为管道服务端(Server),而连接这个管道的进程则称为管道客户端(Client)。事实上,和我们日常生活中的水管类似,管道这一术语非常形象地描绘了它在概念上的特征:通常它具有两端,用以连接两个进程;其中一个进程向管道写入数据,另外一个进程则从管道中读取数据。

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-31584.png" width="555" height="63" />

 

1  管道的通信机制

 

 

由于需要引用别的程序(MASM汇编器、链接器、debug)来实现编译链接功能和调试功能,那么在通过管道来重定向他们的输入输出之前必须要先解决一个问题:那就是先让这些程序运行起来,此外为了便于控制,也必须要将它们作为程序的一个子进程来创建,只有这样才能用管道将子进程和用户的程序连接起来,并且能有效管理子进程,给用户提供了在执行操作的过程中取消操作的机会。

 

整个系统的架构如下图所示:

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-12045.png" width="541" height="260" />

 

2  整体系统架构

 

Visual Masm开发工具具有三大模块:编辑器、编译链接、调试器。其中有很大一部分工作在底层是依靠外部程序来完成的。编译程序使用masm.exe,链接程序使用link.exe,调试程序使用debug.exe。这些外部程序并非特别为本系统而设计,需要对它们进行进一步的封装,使它们能融入Visual Masm开发工具。

 

Windows系列操作系统下,控制台程序可使用系统提供的IO库来实现对硬件设备的流式输入/输出,程序员可向标准输出(stdout,硬件目标通常是显示器或打印机)正常输出各种数据,或通过标准输入(stdin,硬件目标通常是键盘等输入设备)接受用户输入的数据,或在程序运行出错或崩溃时通过标准错误(stderr)输出调试、警告信息等:

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-10724.png" width="638" height="137" />

 

3  管道的正常导向

 

比如,在C++中,通过stdin/stdout/stderr实现输入输出的典型代码如下:

 

cin >> num; // 通过stdin输入数据

 

if(num >= 0) 

 

cout << num; // 通过stdout输出数据

 

else 

 

cerr << “Error occurred!\n”; // 通过stderr输出错误信息

 

 

I/O的重定向是指标准输入、标准输出和标准错误的重定向,比如把标准输出流、错误流的数据重定向到一个文件里,或者是另外一个程序的某个窗口(控件)里。这就需要一个“导管”来将原本流向stdout/stderr的二进制/字符数据导向所需目标,其基本的实现原理如下图所示:

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-13236.png" width="638" height="137" />

 

4  被重定向的管道

 

 

重定向I/O是借助于管道来引导数据流,运用场合通常是在一些IDE(集成开发环境)上,比如在编译调试程序时会在output窗口中显示相关的信息。

 

采用I/O重定向技术,可以在程序中调用其他控制台程序来执行某些工作并将执行过程和结果输出。为了使外部16位的编译、链接、调试程序能在系统中受到控制,需要使用操作系统的命令行解释器程序来启动,通过把要运行的16位程序的路径作为参数传给命令行解释器才能成功重定向。

 

为了实现基于源代码的调试功能,需要先通过debugu指令反汇编程序得到所有指令的内容和地址等信息,然后分析汇编代码,将源代码跟编译后的二进制汇编指令的关系对应起来,如下图所示: 

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-13173.png" width="587" height="239" />

 

分析对应关系

 

只有这样才能灵活地在任意一行源代码对应的汇编指令上设置/删除断点和对程序进行调试的各种操作(如step intostep over等)。而分析汇编代码的难度也比较大,需要分析汇编源代码里的所有标号、指令、声明等,依靠这些信息在反汇编结果中找出每一行汇编源代码对应的地址并记录起来以供使用。

 

这样做的目的是在实现调试的时候可使用这些信息来实现单步和断点调试,但是由于反汇编的结果跟源代码并非简单的对应关系,比如上图中第一行的代码是:

 

MOV AX,data

 

而在debug的反汇编结果中对应的那一行的代码却是:

 

MOV AX,0B8F

 

源代码中的命名内存单元的值在编译后固然会是一个具体的值,因此需要实现模糊匹配,在得到两份代码(一份是源代码,另一份是对应的反汇编结果的'代码)后按照一定的原则进行分析和匹配,才能得到正确的结果。

 

管道管理模块实现的目的是要捕获控制台程序的输入输出,需要三个管道来重定向,保存每个端的句柄等数据;由于子进程的数据输出是异步的,必须创建两个线程来循环读取数据,以免缺漏信息。父进程可通过其读/写句柄来读取/写入数据到子进程,而子进程的输出数据将流入父进程并接受父进程的数据输入。

 

为了方便以后对管道的使用,应该将管道的实现封装成一个类,并提供相应接口;由于需要向窗口的某个控件输出数据,因此这个类中除了要保存相关管道句柄等变量还要保存关联的窗口句柄和控件句柄,另外还要将多线程的部分在里面实现。

 

由于IO重定向类的是为了别的模块的使用而设计,因此它必须提供足够的接口供外部使用,而外部又不需要了解它实现上的细节。为了实现这一点,这个类要自行管理子进程,就必须使用多线程的技术来解决。

 

调试器模块依赖于IO重定向模块的存在,它通过管道写入相应的命令来实现各种调试功能。为了让命令有效执行,它设计有一个队列来记录要执行的命令,这样就可以串行地执行所有的命令而不会停止响应或错过某一条命令了。

 

在开始调试之前,必须先通过代码分析模块来得到汇编源代码和汇编指令的对应关系,才能正常处理断点,因此它要和代码分析模块协作。

 

使用GO命令时除了停止调试命令外的其他命令都将不予执行,因此停止调试命令要有一个较高的优先级,能先于其他命令排到命令队列的前端。

 

为了让用户方便的使用编译、链接和调试的相关功能,在程序的主菜单上设置如下菜单项目:

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-30740.png" width="176" height="157" /> 600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-19528.png" width="206" height="190" />

 

6  菜单项目设计

 

 

为了能够将必要的信息反馈给用户以便用户查看,设计一个输出窗口,用来将编译、链接时的输出信息显示在窗口上(包括编译、链接结果的汇报信息、警告或错误的提示信息等),另外,在程序的调试过程中可能会输出的内容也将通过此窗口予以显示(如下图所示,窗口正在显示的是调用masm.exe编译汇编程序时输出的信息):

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-24681.png" width="426" height="133" />

 

7  输出窗口的设计

 

 

为了能够在调试的过程中将程序的常用寄存器和程序状态字等数据显示出来,设计一个寄存器窗口专门用来显示这些寄存器的数值,此外它还要能够提供用户修改寄存器的数值的方法:

 

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-19711.png" width="170" height="216" />

 

图 8  寄存器窗口的设计

 

 

如上图所示,这是寄存器窗口,上面显示了包括常用寄存器和程序状态字的数值内容。当用户需要修改某一寄存器的数值时只需要双击该寄存器的数值显示区域或者在该区域用鼠标右键点击通过访问菜单来进行修改:

 

 

600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-15041.png" width="202" height="114" /> 600)makesmallpic(this,600,1800);' src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ksohtml/wps_clip_image-2970.png" width="247" height="100" />

 

 修改寄存器的界面

 

4 总结

 

当前流行的汇编语言的开发工具是Masm 6.0,这套开发工具对于熟练的汇编语言开发人员来说是比较好用的,是一个集编辑,编译(masm),连接(link),调试(debug)于一体的开发工具,但它并没有提供可视化分开发工具,一切代码均要程序员自己编写,不利于初学者学习汇编语言,并且是一个DOS下的开发工具。国内也有高校开发出一些汇编语言的开发工具,如:Masm For Windows。这些汇编语言开发工具有一个共同的特点:都是基于Windows图形界面的,都有一些简单的自动化的代码(如:初始化代码),在一定程度上可以减少程序员的工作量,其自动生成代码的能力是非常弱的。Visual Masm与现在的这些汇编语言开发工具相比,具有更简单,更方便,更快速的特点。

 

参 考 文 献

 

[1] 王小茹. VC++深入详解[M]北京:电子工业出版社, 2006

 

[2] Stanley B.Lippman,Josee Lajoie, Barbara E.Moo. C++ Primer 中文版[M].4.北京:人民邮电出版社, 2006

 

[3] 候俊杰深入浅出MFC第二版[M].武汉:华中科技大学出版社, 2001

 

[4] 熊力.Windows 用户态程序高效排错[M]北京:电子工业出版社,2007

 

[5] 微软公司. MSDN[EB/OL]. http://msdn.microsoft.com.

 

 

【[16位汇编语言程序的集成开发]调试器模块的设计与实现】相关文章:

1.基于ESMTP的电子邮件发送程序的设计与实现

2.毕业设计:电子楼书系统的开发与实现

3.城市部件数字化系统数据入库模块的设计与实现

4.Java程序开发与运行环境

5.基于FPGA的HDLC通信模块的实现

6.基于Vxworks实时操作系统的串口通信程序设计与实现

7.设计开发控制程序范本

8.实现鼠标画图的Java程序

9.客户关系管理的设计与实现