146
汇编语言程序设计实验平台的设计
王代君,马钰杰
(桂林电子科技大学计算机与信息安全学院,广西桂林:541004)
createprocessa摘要:该汇编语言程序设计实验平台利用新的构件和技术,完成了版集成运行环境平台;该平台系统分为软件界面
与核心功能部分,实现了从编码到编译运行的各个环节的真实模拟,平台操作简便,界面友好;为汇编语言程序设计学习者提供了较好的学习平台。关键词:汇编语言程序设计;学习者;实验平台中图分类号:TP313文献标识码:A 文章编号:1673-1131(2019)11-0146-02传统的汇编语言程序设计实验平台功能虽然强大,但使用步骤较复杂、界面不够友好以及64位的WINDOWS 系统无法使用DEBUG.EXE 对汇编程序进行反汇编等等。针对这一现象,本次实验平台开发主要以面向用户,操作简便和界面友好作为实验平台设计的主要内容,并且在菜单上设置步骤编号和一键操作编译链接以及提示信息,一键载入并重定位的汉字菜单按钮和提供反汇编核心功能等。
1系统功能需求
1.1功能核心需求
汇编语言程序设计实验平台核心功能是整个软件系统的数据枢纽,主要功能包括:编译链接功能、虚拟环境、DOS 程序重定位、指令模拟运行及反汇编功能、中断功能、IO 缓冲区、运行和单步运行功能等。
1.2软件界面需求
本平台的软件界面中各个功能视图包含:代码编辑器、反汇编视图、程序字节码视图、内存视图、输出视图、寄存器视图和软件换肤功能等。
2系统设计
2.1系统结构设计
汇编语言程序设计实验平台从结构上分为软件界面与功能核心部分。软件界面提供给用户编写代码,调试程序和观察程序运行状态等;功能核心部分负责底层如内存仿真,指令执行和程序调试功能等。系统结构图如图1
所示。
图1系统结构图
2.2功能核心模块设计
平台核心功能使用C++进行开发,C++在开发底层程序具有天然的优势,是操作底层数据的有效工具,能灵活自由操作字节数据和简洁高效的底层软件。
(1)编译链接功能设计
本系统使用MASM 作为编译器,支持80x86汇编以及Win32Asm 。链接器使用MASM 附带的链接器LINK.EXE 。获取编译器或者链接器的返回结果可以使用匿名管道通信技术。使用CreatePipe 函数创建一个匿名管道,创建管道之后配置管道的启动属性STARTUPINFO ,再设置wShow-Window 为SW_HIDE 属性,表示新进程以隐藏界面的形式运行,并将hStdInput 和hStdOutput 还有hStdError 属性设置为管道,将管道启动属性配置好,再使用CreateProcess 函数新建进程,等待进程运行结束后使用ReadFile 函数从管道内取出数据,然后将管道用CloseHandle 关闭。
(2)虚拟环境设计
虚拟环境是一种系统资源,在CPU 的实模式下,使用二维的编址方式为内存地址编址。经过逻辑地址到绝对地址的转换后访问所需的数据。在核心功能初始化时,创建并初始化DosRuntime 对象,DosRuntime 对象初始化时会申请段连续内存空间作为虚拟环境内存空间。DosRuntime 类还拥有一个Register 类型成员,Register 类负责虚拟环境寄存器的管理。整个功能核心由DosRuntime 对象实现对虚拟环境的初始化和虚拟环境的管理。
(3)DOS 程序重定位设计
利用DOS 程序文件头中获取到的重定位表的偏移和重定位表的项数,生成一个重定位列表;DOS 程序重定位由DosRuntime 对象实现,当DosRuntime 对象载入DosExe 对象后,会遍历RelocationTable 对象,将RelocationTable 记录着的需要重定位的地址加上段起始地址,完成DOS 程序重定位。
(4)指令模拟运行与反汇编功能设计
声明一个拥有256个成员的数组表示指令集,在指令函数里根据操作码获取后续字节并作解析或者运行。功能核心需要运行汇编指令,在指令集开发中使用Lamda 表达式,减少函数数量,使用数组OpCodeListOpCodeTable [0x100]作为指令集列表,结构体含有一个成员变量Call ,Call 在结构体初始化时预设为一个空指令函数,通过返回“??”来提示该操作码无法解析[1]。利用操作符作下标,在OpCodeTable 数组中对应的OpCodeList 对象,通过调用OpCodeList 对象的成员Call 所指向的指令函数。实现指令模拟运行及反汇编功能。
(5)中断功能
中断实现函数在软件开启后通过注册中断函数注册到功能核心中,功能核心声明有一个全局变量INTCall ,INTCall 是一个参数为整型的函数指针,整型参数为中断功能号,用于保存注册的中断执行
函数,通过函数指针调用中断函数,将这个中断函数地址赋值到函数指针中,触发软件界面中的中断,完成中断函数的注册。
2019
(Sum.No 203)
信息通信
INFORMATION &COMMUNICATIONS
2019年第11期(总第203期)
147
(6)运行和单步运行运行指令的步骤为:根据IP 寄存器取指令,解析指令,取后续指令,执行,修改IP 寄存器;核心功能每调用一次Call 函数,即每次只取一次指令并执行,可以完成单步运行的功能,就若要持续运行,只需要循环执行单步运行的步骤即可实现。Call 函数最终会由软件界面进行调用,为了不影响软件界面的画面刷新,需要新建一个线程来运行Call 函数,软件界面设置几个信号,分别用于控制线程的暂停和停止,在线程中,使用WaitForSingleObject 来等待处理信号,利用Wa-itForSingleObject 函数的挂起效果,实现程序中断,运行,暂停功能等。
2.3软件界面设计
(1)代码编辑器视图设计
代码编辑器视图对汇编关键词、数字和字符进行高亮处理,使代码变得更加简洁美观,代码高亮颜的自定义,字体自定义和行号显示功能等,使用SynEdit 的VCL 控件制作,一次可编辑多个文件,无须其他任何运行库支持就可以独立运行。代码编辑器视图如图2
所示。
图2代码编辑器视图
(2)反汇编视图
源代码编译完毕后,软件会对其进行反汇编,将其反汇编代码显示在反汇编视图中,使用SynEdit 函数制作。在后续调试过程中,可以在反汇编中进行单步调试运行,反汇编视图将反汇编代码按指令地址,字节码,汇编指令的格式进行显示,其次对断点进行红背景高亮突出显示,运行时,行号左边有一个箭头标识当前运行的指令。反汇编视图调用功能核心相关函数完成反汇编任务后,将反汇编代码返回给反汇编视图。
(3)程序字节码视图设计
程序字节码视图需要显示十六进制数据,使用TLovelyHex20的开源控件模仿文本编辑器Uedit32的界面进行界面设计,调用核心功能获取程序字节码的功能函数之后,得到程序字节码的字节流返回,将字节流作为参数生成一个TLovelyHex20的开源类,开源类可以友好的显示十六进制数据及其ASCII 字符。程序字节码视图如图3
所示。
图3程序字节码视图
(4)输出视图和寄存器视图
输出视图位于软件的下边,寄存器视图位于软件右边;输出视图和寄存器视图使用DELPHI 2010自带
的TMemo 控件,完成字符的显示。TMemo 组件中Lines 成员存着显示文本,只要在Lines 追加字符串就可以实现文本的显示功能。
(5)软件换肤功能设计
使用DELPHI 的第三方控件可以实现静态使用皮肤软件换肤功能。DELPHI 有三个常用的软件皮肤库。Alpha-Controls 是皮肤库里界面最美观,且操作简单。使用Alpha-Controls 皮肤,需将AlphaControls 提供的TsSkinManager 控件拖到窗体,然后配置TsSkinManager 皮肤目录和皮肤包两个属性。自定义换肤功能的实现需要动态创建TsSkin-Manager 控件,在窗体的构造函数中创建TsSkinManager 对象,再从软件配置文件中读取皮肤包名称,让窗体在创建过程中使用皮肤实现自定换肤功能,加入皮肤效果的软件界面图如图4
所示。
图4带皮肤的软件界面图
3结语
本汇编语言程序设计实验平台基本实现了具有代码高亮易于使用的代码编辑器、可执行程序分析对比的视图窗口、内存视图窗口、汇编程序调试运行和反汇编视图等。用户可在前台软件界面上完成编码、编译链接以及调试运行等功能,后台可以对DOS 程序字节指令进行模拟运行和反汇编以及DOS 程序装入内存和重定位等。系统界面简洁易用,操作简单,易于理解,降低了用户使用难度和在编辑代码时失误的几率,使得整个软件流程更加生动形象,提升了用户的使用体验,让用户能够按照自己的思路而不是拘泥于课本知识来进行实验,拓展其思维,更加深入理解汇编语言知识。参考文献:[1]文雪巍.谈应用性本科院校汇编语言学习的重要性[J ].经
济研究导刊,2014,(19):275~276.[2]周超,董军军.Linux 进程间管道通信的研究[J ].电脑开发与应用,2008,(1):48~50.
[3]卜登立.一种在应用程序和控制台应用程序间进行通信的机制[J ].电脑开发与应用,2006,(3):48~50.
[4]钱林松,赵海旭.C++反汇编与逆向分析技术揭秘[M ].北京:机械工业出版社,2011.
[5]郑晓薇.汇编语言(第2版)[M ].北京:机械工业出版社,2014.
[6]
王永喜.基于物理虚拟实验室促进学生创新能力的研究[D ].兰州:西北师范大学,2011.
信息通信
王代君等:汇编语言程序设计实验平台的设计
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论