资源预览内容
第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
亲,该文档总共6页全部预览完了,如果喜欢就下载吧!
资源描述
Visual Masm 集成开发工具的设计-调试器模块的设计与实现摘要:本设计主要完成了16位汇编语言程序的集成开发环境Visual Masm的开发,改善现有的各种汇编程序开发环境并增加它们所不具有的功能。本文主要介绍了编译、调试两个功能部分,实现汇编代码的编译、链接、调试等功能,并提供友好的用户界面,为汇编语言的编译、链接、调试提供了可视化的开发环境,并详细介绍了管道管理模块、调试模块、寄存器管理模块。关键词: 汇编 调试器 管道 重定向Design and Realization of Debugger in Visual Masm Integrated Development Environment Abstract: This thesis describes the design and realization of debugger 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 feature. The Visual Masm IDE introduces two core modules, compiler 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; redirection1 前言汇编语言是一种低级语言,它具有直接操纵硬件的能力,一直以来在底层开发应用得比较多,比如说在单片机、板卡驱动程序、系统内核等领域。由于汇编语言与具体的机器指令有关,能直接操作硬件(例如:寄存器、端口、内存),而且没有结构化的控制语句,使得汇编语言难学难懂,用汇编语言来开发软件更难。传统的汇编语言开发工具一般是用一般的编辑工具,如:记事本、Edit等文本编辑工具来编写源文件,再在Dos下编译、连接成一个可执行文件。或者用Masm 6.0来开发汇编语言程序。在这两种开发方式中,程序员要负责每一行代码的编写,工作量大又容易出错。这也是每一个汇编语言初学者惧怕汇编语言的一个方面。长期以来汇编语言被认为是一门枯燥难学的语言,在入门时需要记忆大量的指令,而且往往需要对硬件的组成和运行机制有所了解,由于直接与系统底层打交道,要实现的每一部分功能都必须由程序员完全负责实现,哪怕是在高级语言里面看来是一行代码即可实现的最简单的一条语句,到了汇编语言则往往变成需要靠多行指令来完成。要解决这种问题,需要一个优秀的IDE(集成开发环境)来提高使用汇编语言学习和开发软件的效率。Visual Masm是一个集编辑,编译(masm),连接(link),调试(debug)于一体;具有自动初始化代码能力,并提供一些常见操作的开发包,可以自动产生常见操作的汇编语言代码;拥有智能化的编辑环境;具有关键字高亮功能,并可标记行数,记行报错,提供的可视化的调试界面。2相关技术2.1 多线程编程技术多线程在各种流行的操作系统中都有实现,是一种是用来实现多种操作的并发执行的机制,它是操作系统代码的运行环境中的最小执行单位,每个进程都必须至少有一个线程,多线程编程在系统编程中属于较为复杂的技术,它涉及到对线程的控制问题。在本次设计中,必须运用多线程编程技术来配合管道技术实现调试模块的功能。2.2 管道的使用要达到捕获其他程序的输出(标准输出stdout、标准错误输出stderr)和向其输入(标准输入stdin)的目的,实际上就是要实现进程间的信息交换,进程之间互相交换信息的工作称之为通信IPC(Inter Process Communication)。管道是用于进程间通信的一段共享内存,创建管道的进程称为管道服务端(Server),而连接这个管道的进程则称为管道客户端(Client)。事实上,和我们日常生活中的水管类似,管道这一术语非常形象地描绘了它在概念上的特征:通常它具有两端,用以连接两个进程;其中一个进程向管道写入数据,另外一个进程则从管道中读取数据。共享文件(数据)进程A写进程B读图1 管道的通信机制2.3进程的控制由于需要引用别的程序(MASM汇编器、链接器、debug)来实现编译链接功能和调试功能,那么在通过管道来重定向他们的输入输出之前必须要先解决一个问题:那就是先让这些程序运行起来,此外为了便于控制,也必须要将它们作为程序的一个子进程来创建,只有这样才能用管道将子进程和用户的程序连接起来,并且能有效管理子进程,给用户提供了在执行操作的过程中取消操作的机会。3 系统设计3.1 系统架构整个系统的架构如下图所示:图2 整体系统架构Visual Masm开发工具具有三大模块:编辑器、编译链接、调试器。其中有很大一部分工作在底层是依靠外部程序来完成的。编译程序使用masm.exe,链接程序使用link.exe,调试程序使用debug.exe。这些外部程序并非特别为本系统而设计,需要对它们进行进一步的封装,使它们能融入Visual Masm开发工具。3.2 调用外部程序实现编译/链接/调试在Windows系列操作系统下,控制台程序可使用系统提供的IO库来实现对硬件设备的流式输入/输出,程序员可向标准输出(stdout,硬件目标通常是显示器或打印机)正常输出各种数据,或通过标准输入(stdin,硬件目标通常是键盘等输入设备)接受用户输入的数据,或在程序运行出错或崩溃时通过标准错误(stderr)输出调试、警告信息等:控制台程序键盘屏幕/打印机屏幕/打印机stdinstdoutstderr图3 管道的正常导向比如,在C+中,通过stdin/stdout/stderr实现输入输出的典型代码如下:cin num;/ 通过stdin输入数据if(num = 0) cout num;/ 通过stdout输出数据else cerr “Error occurred!n”;/ 通过stderr输出错误信息I/O的重定向是指标准输入、标准输出和标准错误的重定向,比如把标准输出流、错误流的数据重定向到一个文件里,或者是另外一个程序的某个窗口(控件)里。这就需要一个“导管”来将原本流向stdout/stderr的二进制/字符数据导向所需目标,其基本的实现原理如下图所示:控制台程序进程stdinPipe(引导stdout)Pipe(引导stderr)图4 被重定向的管道重定向I/O是借助于管道来引导数据流,运用场合通常是在一些IDE(集成开发环境)上,比如在编译调试程序时会在output窗口中显示相关的信息。采用I/O重定向技术,可以在程序中调用其他控制台程序来执行某些工作并将执行过程和结果输出。为了使外部16位的编译、链接、调试程序能在系统中受到控制,需要使用操作系统的命令行解释器程序来启动,通过把要运行的16位程序的路径作为参数传给命令行解释器才能成功重定向。3.3分析汇编代码的实现为了实现基于源代码的调试功能,需要先通过debug的u指令反汇编程序得到所有指令的内容和地址等信息,然后分析汇编代码,将源代码跟编译后的二进制汇编指令的关系对应起来,如下图所示: 图5 分析对应关系只有这样才能灵活地在任意一行源代码对应的汇编指令上设置/删除断点和对程序进行调试的各种操作(如step into、step over等)。而分析汇编代码的难度也比较大,需要分析汇编源代码里的所有标号、指令、声明等,依靠这些信息在反汇编结果中找出每一行汇编源代码对应的地址并记录起来以供使用。这样做的目的是在实现调试的时候可使用这些信息来实现单步和断点调试,但是由于反汇编的结果跟源代码并非简单的对应关系,比如上图中第一行的代码是:MOV AX,data而在debug的反汇编结果中对应的那一行的代码却是:MOV AX,0B8F源代码中的命名内存单元的值在编译后固然会是一个具体的值,因此需要实现模糊匹配,在得到两份代码(一份是源代码,另一份是对应的反汇编结果的代码)后按照一定的原则进行分析和匹配,才能得到正确的结果。3.4 管道管理模块的设计管道管理模块实现的目的是要捕获控制台程序的输入输出,需要三个管道来重定向,保存每个端的句柄等数据;由于子进程的数据输出是异步的,必须创建两个线程来循环读取数据,以免缺漏信息。父进程可通过其读/写句柄来读取/写入数据到子进程,而子进程的输出数据将流入父进程并接受父进程的数据输入。为了方便以后对管道的使用,应该将管道的实现封装成一个类,并提供相应接口;由于需要向窗口的某个控件输出数据,因此这个类中除了要保存相关管道句柄等变量还要保存关联的窗口句柄和控件句柄,另外还要将多线程的部分在里面实现。由于IO重定向类的是为了别的模块的使用而设计,因此它必须提供足够的接口供外部使用,而外部又不需要了解它实现上的细节。为了实现这一点,这个类要自行管理子进程,就必须使用多线程的技术来解决。3.5 调试模块的设计调试器模块依赖于IO重定向模块的存在,它通过管道写入相应的命令来实现各种调试功能。为了让命令有效执行,它设计有一个队列来记录要执行的命令,这样就可以串行地执行所有的命令而不会停止响应或错过某一条命令了。在开始调试之前,必须先通过代码分析模块来得到汇编源代码和汇编指令的对应关系,才能正常处理断点,因此它要和代码分析模块协作。使用GO命令时除了停止调试命令外的其他命令都将不予执行,因此停止调试命令要有一个较高的优先级,能先于其他命令排到命令队列的前端。3.6 用户界面的设计1.菜单项目的设计为了让用户方便的使用编译、链接和调试的相关功能,在程序的主菜单上设置如下菜单项目:图6 菜单项目设计2.输出窗口的设计为了能够将必要的信息反馈给用户以便用户查看,设计一个输出窗口,用来将编译、链接时的输出信息显示在窗口上(包括编译、链接结果的汇报信息、警告或错误的提示信息等),另外,在程序的调试过程中可能会输出的内容也将通过此窗口予以显示(如下图所示,窗口正在显示的是调用masm.exe编译汇编程序时输出的信息):图7 输出窗口的设计3.寄存器窗口的设计为了能够在调试的过程中将程序的常用寄存器和程序状态字等数据显示出来,设计一个寄存器窗口专门用来显示这些寄存器的数值,此外它还要能够提供用户修改寄存器的数值的方法:
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号