8086汇编开发环境搭建和Debug模式介绍(图文详解)

1. 8086汇编开发环境搭建

  在上篇博客中简单的介绍了8086汇编语言。工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境。

  汇编语言设计之初是用于在没有操作系统的裸机上直接操作硬件的,但对于大部分人来说,在8086裸机上直接进行编程将会面临各种困难。好在我们可以使用软件模拟器来模拟硬件进行8086的学习实践。在《汇编语言》中作者推荐通过windows环境下的masm和debug进行学习。

masm介绍:

  masm是一款DOS下的汇编工具包,在8086汇编的学习中我们需要其中的几个文件,分别是masm.exe,link.exe。

  masm.exe汇编器,用于将文本格式的汇编语言源文件编译为.obj结尾的二进制文件,其生成的.obj结尾的二进制目标文件是被编译的源文件的对应的机器码。单独的源程序目标文件通常是无法直接运行的,还需要和互相依赖的其它同样编译完成的二进制文件链接在一起才能生成最终的可执行文件(比如所需要的静态库函数)。因此,obj文件通常也被叫做中间文件。

  link.exe链接器,obj文件需要通过链接才能转换成可执行程序,而链接器就是负责完成这一任务的。链接器能将多个obj目标文件以及其所依赖的库程序进行统一处理(例如多个目标文件中指令、数据内存地址的偏移处理),并生成可执行文件。

debug介绍:

  debug.exe调试器,windows提供了一个在dos中调试8086汇编程序的工具debug.exe,提供了展示程序运行时CPU中各寄存器、内存中数据,指令级的单步调试等功能。debug程序的使用会在本篇博客的后半段进行详细介绍。

64位操作系统兼容性问题:

  由于《汇编语言》一书出版较早,当时的windows系统还是32位的,32位windows系统都默认安装了masm与debug,能打开dos窗口直接使用。但目前普遍使用的、新的windows 64位操作系统中却并没有默认提供masm工具包和debug.exe,同时masm、debug也与64位的windows系统版本不兼容。

想在64位的windows系统下使用masm、debug有两个常用方法:

  1. 通过虚拟机安装一个老版本的windows操作系统(推荐windows xp)

  2. 通过DOSBox这一轻量级的ms-dos模拟器来运行,但上文所述的依赖程序需单独下载(百度网盘下载链接:

链接: https://pan.baidu.com/s/1JlOEFoV7h37Z_NY7NKc-gw

提取码: x3ai

  个人推荐第二种方法,下面介绍如何在windows64位操作系统下使用DOSBox来搭建8086汇编语言的开发环境。

DOSBox安装与使用

DOSBox下载安装:

  DOSBox可以在官网下载,这里也提供了百度网盘的下载链接(0.74版本):

链接: https://pan.baidu.com/s/1W3f6_jsSK4HrHWDO_IfqRg

提取码: 7ugx

  安装完毕后,找到安装目录下的DOSBox.exe并启动,能看到如下图界面。

  

  作为dos的模拟器和普通的dos窗口没有明显区别,但是初始时并不能直接访问到本地磁盘,需要先将本地磁盘挂载到DOSBox中。

DOSBox挂载本地磁盘:

  1. 在本地操作系统磁盘上选择一个文件夹目录,作为挂载的磁盘路径(例如C:\dos)

  2. 在DOSBox启动的dos窗口中执行命令:mount C C:\dos(代表着将本地的C:\dos路径挂载到DOSBox的C盘路径下),能把dos窗口的工作目录切换到C盘,接下来就可以正常访问被挂载的磁盘路径下的内容了。

  3. 将前面提到过的debug.exe等文件都放在这个挂载的本地磁盘路径下(例如C:\dos),通过DOSBox就可以兼容的运行masm工具包中的程序和debug.exe了

  

添加自动执行脚本以避免重复操作:

  由于上述DOSBox的磁盘挂载是临时的,每次重新启动DOSBox后都需要重新输入命令进行挂载,太麻烦了。我们可以通过修改DOSBox配置的方式,免去这些重复的操作。

  找到DOSBox安装目录下的DOSBox 0.74 Options.bat,使用系统自带的记事本直接打开,暂不研究其它配置段的作用,找到最后的【autoexec】段,配置在【autoexec】的内容会作为命令在DOSBox启动时按顺序被自动执行。  

  将挂载磁盘操作命令配置在【autoexec】段中能避免重复操作。修改并保存配置文件后,重新启动DOSBox,发现配置中添加的命令会被自动执行。

  

2. 8086debug模式介绍

  在搭建好了8086汇编的开发环境后,接下来介绍8086的debug模式。执行debug.exe以进入debug调试模式,在dos中通过输入命令的方式进行交互。

  

  debug模式下有20多种不同命令,限于篇幅这里只会介绍几个以后实验时常用到的命令。(通过回车执行命令,DOS下的命令默认是不区分大小写的)

R命令查看/改变CPU寄存器内容

  R命令的作用是查看和修改debug模式下CPU中寄存器的值。

  (-r)单独的输入r,可以查看当前CPU的内容

  (-r 寄存器名) r加上寄存器名可以在接下来的":"提示后输入新的值,以达到修改对应寄存器内容的目的(示例中第二行 AX 0000表示修改前寄存器AX的值为0000)

  

D命令 查看内存中的内容

  D命令的作用是查看内存中的内容。

  D命令有许多不同的传参方式可供使用,先介绍最易理解的(段地址:偏移地址)查看方式。D命令默认会显示寻址地址开始的后128个内存单元的内容,以16进制的方式显示(每个内存单元8位,一行最多16个内存单元),而最右边会将内存单元中的二进制数据以ascll码的形式翻译展示。

  

  有时,我们只想聚焦于某一部分内存地址的内容,而默认展示的内存视图不是很方便。

  D命令提供了另外一种访问内存的方式(段地址:偏移起始地址 偏移终止地址),其能够展示(段地址:偏移起始地址 至 段地址:偏移终止地址)的内存信息,范围两端均为闭区间。

  

E命令 改变内存中的内容

  E命令的作用是改变内存中的内容。

  和对CPU中寄存器的查看,修改不同,对内存进行查看和修改较为复杂,为此debug设计了两个不同的命令分别进行控制(E命令修改内存、D命令查看内存)。

  通过(E 起始地址 数据1 数据2 数据3...)命令可以修改内存中以起始地址开始,顺序的N个内存单元的值(N为实际参数传递的数量)。

  

  也可以和R命令修改CPU中寄存器值类似的,通过提示来修改特定内存单元的值。00.12 00代表内存单元在修改前的值,12是我们手动输入的、需要修改的新值。

  

  可以通过E命令向内存输入对应的机器指令,因为机器指令也是数据的一种。

有以下指令(左侧为机器码,右侧为对应的汇编指令):

  B80100  mov ax,0001

  BB0200  mov bx,0002

  01D8   add ax,bx

  我们可以向内存1000:0处写入这些机器指令,以供接下来通过debug执行这段机器指令 (执行命令:E 1000:0 B8 01 00 BB 02 00 01 D8)。

  

U命令 将内存数据转换为汇编指令展示

  U命令的作用是将内存中的二进制数据转换为汇编指令展示(反汇编)。

  D命令能够将内存中的数据以16进制或ascll码的形式展现出来,但有时我们需要观察的是内存中的机器指令时,D命令的视图过于抽象,不利于理解。debug提供了U命令来解决这个问题。

  对于前面我们在1000:0处输入的机器指令,使用 U 1000:0 命令(u 内存地址)可以将内存中的数据以汇编语言指令的方式进行展示。

  

  可以观察到,左边展示的是内存地址,中间则是16进制的内存视图,右边展示的是内存中数据所对应的汇编指令(例如:1000:0000;B80100;MOV AX,0001)。

  由于我们只输入了三条汇编指令,而后面内存中的数据并不是我们想要执行的,但U命令却依然将其以汇编指令的形式转换并显示出来了。

  这也是前一篇博客所提到的,内存中的数据完全是二进制的,既可以将其看做普通的二进制数据、十六进制数据、ascll码文本数据,也可以视作程序指令,这些二进制的"数据"的处理完全取决于如何对其进行解释。

T命令 单步执行机器指令

  T命令的作用是进行单步机器指令的调试

  以上文通过E命令写入内存1000:0的三条指令举例,介绍如何使用T命令来让CPU执行1000:0处的机器指令。T命令用于单步调试,一次只会执行一条机器指令。

  8086CPU在运行时会将CS:IP寄存器所指向的内存单元中的内容解释为指令执行,要将内存1000:0处的内容作为指令执行必须先修改CS、IP两个寄存器的值,使之指向1000:0。

  

  先执行一次T命令,1000:0处的指令(mov ax,0001)便会被执行,可以观察到寄存器ax的值已经变成了0001;同时寄存器IP的值增加了3(mov ax,0001的指令长度为3),此时CS:IP指向的便是位于1000:3处的下一条指令(mov bx,0002),在视图的最后一行中也有所体现。

  

  再执行一次T命令,会执行1000:3处的指令(mov bx,0002),可以观察到寄存器bx的值变成了0002;寄存器IP的值又增加了3(mov bx,0002的指令长度也是3),此时CS:IP指向的便是位于1000:6处的下一条指令(add ax,bx)。

  

  最后执行一次T命令,add ax,bx会被执行(类似 ax=ax+bx)。寄存器ax的值已经变成了之前寄存器ax和bx中的数据之和0003;寄存器IP的值增加了2(add ax,bx的指令长度是2),CS:IP指向1000:8。

  

A命令 以汇编指令的形式向内存中写入内容

  A命令能够以汇编指令的形式向内存中写入内容

  对于内存操作,D命令可以查看内存中的内容,但如果想查看的是程序指令,显然U命令更加方便;E命令可以向内存中写入数据,但对于程序指令的写入,直接操作二进制机器码的方式过于硬核。为此,debug提供了A命令,我们可以通过A命令以汇编指令的形式向内存中写入内容。

  通过A命令将(mov ax,0001,mov bx,0002,add ax,bx)三条指令写入内存1000:0处:

  

  通过A命令进行指令的写入,和E命令达到的效果一样,但使用起来却更加便捷。A命令能够自动识别所输入汇编指令的长度,正确的在内存中写入程序指令。

  debug提供了D、E两种命令用于对内存进行通用的操作(纯二进制、十六进制数据的读、写)。

  对于程序指令,debug提供了U、A两种命令以更人性化的方式来读写内存中的指令内容。

三 总结

  在debug模式下可以模拟8086汇编非常自由的控制CPU和内存,这也是汇编语言的强大之处和魅力所在。

贴近硬件底层的编程能够让我们编写出来的程序非常高效,但也存在一些问题:

  1.内存中的内容被当做指令还是数据来处理完全取决于如何解释,编程时稍有不慎就会导致CPU执行一些不应该执行的指令,甚至造成巨大的破坏。

  2.在未来还会介绍如何使用汇编语言来实现高级语言中出现的结构体、数组等概念。这些数据结构完全是程序逻辑上的,内存本身可没有这些功能。因此在使用汇编访问内存中结构化的数据时,一不小心就会出现内存访问越界,错位等问题。

  3.汇编语言的抽象程度过低,许多在高级语言中很简单的功能在汇编中也需要很多的代码来实现(汇编实现的控制台打印helloworld可能是常用语言中最繁琐的了)。

  编程语言的贴近底层与机器高效性如果站在更高的角度上看其实是一把双刃剑:直接操控底层的机器方便,机器执行效率高的同时,也是危险、开发效率底下的。汇编语言程序员不得不付出巨大的精力来仔细思考、斟酌这些底层机器层面的细节,以避免出现相关bug,大大降低了开发效率。这也是高级语言诞生,并不断发展的主要原因。

  高级语言大家族中按抽象程度来看,从偏底层的C,C++到java、python等,再到目前抽象程度最高的lisp。随着抽象程度的提高,离机器底层越远,执行效率通常也随之降低。但程序员所需要考虑的机器细节也就越少,能更专注于业务逻辑,进而提高了开发效率。比如在使用C编程时还需要仔细考虑指针错误,堆上无用内存回收等问题,到了更高级的java、python中,这些问题都交由编译器、虚拟机解决了,对开发人员也几乎透明了。

  天下没有免费的午餐,在选择适合的编程语言开发程序时,需要在机器执行效率和开发效率间做出取舍。但随着科学技术的发展,计算机硬件会越来越强大,对机器效率的担忧会越来越少,对程序开发效率的考虑将占据主导地位,越来越多的程序将会倾向于使用抽象程度更高的编程语言进行开发。

  虽然需要使用汇编语言的场合越来越少,但对汇编语言和底层机器硬件有一定的了解的话,依然能够帮助程序员更深刻的理解上层的知识内容、写出更高效的程序。

  毕竟,人类是无法抽象、封装到完美无缺的,有时还是你需要跳进下水道,深入底层一探究竟的。

  总结

以上所述是小编给大家介绍的8086汇编开发环境搭建和Debug模式介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 汇编语言环境搭建软件与教程

    1.编写汇编程序需要的环境: 1]dosbox 2]masm 上面两个软件打包下载:https://www.jb51.net/softs/709793.html 2.搭建步骤: 1]下载dosbox 2]安装dosbox 下载的dosbox解压: 运行exe,一直下一步即可: 3]下载masm masm用来编译汇编程序: 到网上搜索下载即可: 解压目录如下: 将解压masm,将文件放在特定的目录下: 例如:D:\GongJu\masm 4]挂载dosbox 目的是将dosbox的c盘挂载到mas

  • 汇编环境搭建之如何快速安装和配置DOSBox

    掉头发掉的那些事: 本来之前是安装好了从老师那里复制过来DOSBox的,但是在挂载和编辑和调试哪里却被网上的各种方法搞得晕头转向,怎么弄也弄不好!咦?为什么我打不开edit??咦?为什么我生成不了.obj文件??咦???我想这也是很多汇编初学者同样会遇到的困扰吧~ 在被DOSBox折磨的痛不欲生之后,找遍网络终于在我大腿师兄哪里找到了一种正确快速安装和使用DOSBox的方法,这里与各位爱学习的小伙伴们分享一下,如果还有什么问题,欢迎各位小可爱们可以提出来我们一起讨论进步!!! 第一步  下载并安

  • 汇编语言编译环境搭建过程

    1. 将masm615文件夹拷贝在C或D盘或其他(文件路径不要有中文文件夹) 2. 运行DOSBox(网上下载) 3. DOSBox软件中输入命令mount C C:\masm615(假设masm615安装在C盘),回车输入C: 4. 测试程序test1.asm DATA SEGMENT BUFFER DB "1 STYLE ONE ", 0DH, 0AH DB "2 STYLE TWO ", 0DH, 0AH DB "3 EXIT ", 0DH

  • Windows10下利用DOSBOX和MASM32搭建汇编语言开发环境

    1 工具准备 1)下载DOSBOX 工具介绍:DOSBox 是一个 DOS 模拟程序,由于它采用的是 SDL 库,所以可以很方便的移植到其他的平台.目前,DOSBox 已经支持在 Windows.Linux.Mac OS X.BeOS .palmOS.Android .webOS.os/2等系统中运行.不少DOS下的游戏都可以直接在该平台上运行. 工具官网:http://www.dosbox.com/ 项目主页:http://sourceforge.net/projects/dosbox/ 下载

  • 8086汇编开发环境搭建和Debug模式介绍(图文详解)

    1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语言.工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境. 汇编语言设计之初是用于在没有操作系统的裸机上直接操作硬件的,但对于大部分人来说,在8086裸机上直接进行编程将会面临各种困难.好在我们可以使用软件模拟器来模拟硬件进行8086的学习实践.在<汇编语言>中作者推荐通过windows环境下的masm和debug进行学习. masm介绍: masm是一款DOS下的汇编工具包,

  • PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解

    使用Python进行数据分析,大家都会多少学习一本经典教材<利用Python进行数据分析>,书中作者使用了Ipython的交互环境进行了书中所有代码的案例演示,而书中的Ipython交互环境用的是原生Python开发环境,在原生环境里,由于没有代码提示.自动格式等智能辅助给你,导致编码效率有点低下,之前就有很多人在问,能不能在PyCharm这款目前最流行最智能的python IDE里设置Ipython的交互环境,我自己也做了尝试,经过自己不断摸索和实践,总结出了在PyCharm设置Ipytho

  • Golang环境搭建及打包和工具链详解

    目录 一.环境搭建 二.包 三.导入 四.init函数 五.一些常用go命令 一.环境搭建 从https://golang.google.cn/dl/下载安装即可 新建GO_HOME 系统环境变量,指向go的安装目录在终端输入go dev即可测试有无安装成功 二.包 所有Go程序的程序都会组织成若干组文件,每组文件被称为一个包.每个包的代码都可以作为很小的复用单元,被其他项目引用.①所有的go文件都应在第一行声明自己所属的包.每个包都在一个单独的目录里.这意味着同一个目录下的所有.go文件都必须

  • ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解

    本文实例讲述了ThinkPHP框架整合微信支付之Native 扫码支付模式二.分享给大家供大家参考,具体如下: 大家好,这篇文章是继微信支付之Native 扫码支付 模式一之后的微信支付系列教程第三篇:扫码支付之模式二 介绍下扫码支付目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! 首先我们还是一样,导入微信支付的类库: 接下来是Public下的文件: 以上跟Native扫码模式一一样,不明白请看 //w

  • ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解

    本文实例讲述了ThinkPHP框架整合微信支付之Native 扫码支付模式一.分享给大家供大家参考,具体如下: 大家好,这篇文章是继微信支付jsapi篇之后的微信支付系列教程第二篇:扫码支付之模式一介绍下扫码支付目前有两种模式,模式一比模式二稍微复杂点,至于模式一与模式二的具体内容,流程,微信开发文档都有详细介绍,这里就不多说废话,接下来赶紧上教程! 首先我们还是一样,导入微信支付的类库: 接下来是Public下的文件: 这里的配置跟JSAPI支付一样,不需要改动 具体关于文件介绍请参考JSAP

  • 基于visual studio code + react 开发环境搭建过程

    开发环境 windows 开发工具 visual studio code node 安装和 npm windows 安装node 可以直接在 node官网直接下载直接当作普通软件安装即可. 安装完成可以在控制台中运行node测试是否安装成功 win + r 输入 cmd ,直接在终端输入node -v 输出版本号及已经成功安装. 目前新版本的node自带npm(npm 是随同 node 一起安装的包管理工具).这里安装好了 node并且测试安装成功之后,可以继续在控制台输入 npm -v 检查是

  • X86汇编调试环境搭建的过程

    最近毕设需要做一个基于X86的微型OS内核,一直在学习汇编,前来记录一下 汇编环境搭建 本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可以使用masm插件),还有一个hexdump for VSCode. 安装NASM,并添加到环境变量 安装QEMU,并将其添加到环境变量下 编写代码:(代码来自30天自制操作系统) ; hello-os ; TAB=4 ; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code

  • VScode + keil开发环境搭建安装使用过程

    写在前面 来了新公司之后,由于这次遇见的单片机是GD32,之前的前辈也都在keil上编程,所以又不得不拿起keil,可是无奈天下苦keil的UI久矣,中途尝试过几次修改KEIL高亮及颜色等,效果均不好,还发生不少bug事件,一会文件不能保存,一会编译报未知错误,没办法,得想办法另辟途径了,于是一顿网上冲浪,发现VScode上,可以完美解决我的问题,废话不多说,直接干! Keil Assistant 插件安装与使用 其实在Vscode上就有专门的插件可以调用keil的接口去实现编译和下载 - Ke

  • VS2022+unity3D开发环境搭建的实现步骤

    目录 1 安装 Unity 2 使用 Visual Studio 调试 1 安装 Unity 安装Unity Hub 安装 Unity 推荐使用 Unity Hub 管理程序(官方管理程序). Unity Hub 是一种管理工具,可让您管理自己的所有 Unity 项目和安装.使用 Hub 可以管理 Unity Editor 的多个安装及其关联组件,创建新项目,以及打开现有项目. 官网下载:https://store.unity.com/cn/download 安装Unity打开Unity Hub

  • OpenCV4.1.0+VisualStudio2019开发环境搭建(超级简单)

    先说一下其实根本无需修改环境变量等系统设置,只需要对 project 进行一些设置就好. 编译需要的是 .h 文件和 .lib 文件,运行需要的是 .dll 文件,调试需要的是代码源文件和 .pdb 文件. 1. 准备 Open CV 的文件 : https://opencv.org/releases/ 解压到哪里无所谓,我们后面会把需要的文件复制到 Solution 的目录里面. 2. 在 vs 中新建一个空的工程,添加一个 source.cpp,随便加几行代码能跑起来.注意把 Solutio

随机推荐