版本1:加载img直接使用配置文件,可以使用断点!!

    保护模式的程序没有办法直接调试。所谓的直接调试,指的是使用debug这样工具

 

进行的调试,无论是debug32 还是传说中的softice for dos 都不可以。唯一的方法是在

 

虚拟机上进行的调试。有一款虚拟机,就是专门为这样的事情设计的。他就是BOCHS。

 

    关于这个软件的使用,在此就不介绍了。主要说一下如何进行保护模式的程序的调试。

 

第一个问题是:Bochs是为了调试保护模式的操作系统设计的。就是说,从引导过程开始的

 

程序,而不是已经进入了纯dos,再进入保护模式的程序。对于这个问题,我们的思路是,

 

设置好断点,进入dos之后,让我们的程序触发中断即可…….

 

查一下Bochs的手册,上面有内存读写的中断,于是首先选择了这样的指令:

 

      watch read [addr]

 

    但是随后发现,不知道为什么,程序无法触发这样的中断。也许是因为addr给出的

 

地址是线性地址,而我们的程序,最开始,只能触发[seg:ofs]这样的地址。(说明:我发现

 

Bochs中,即使这两种格式即使指向相同的物理地址,对断点来说也是不同的)。

 

     第二个问题就是:设置一种容易实现的断点,最终,发现Bochs在执行断点上是可以

 

区分的。我们只要设置一个绝对执行的位置就可以了。编写程序如下:

jmpSeg              equ              600*1024 /16              ;打算修改的段

mov              ax,jmpSeg

mov              ds,ax                                                                      ;ds=打算修改的段

xor              si,si

mov              ax,ds:[si]                                                        ;修改 ds:0 的位置

push              ax                                                                      ;安全起见,在堆栈保存这个位置的值

mov              byte ptr ds:[si],0CBh                            ;将这个位置设置为 retf

push              offset              back                                                        ;设置返回位置

push              cs

db              0EAh                                                                      ;远跳转

dw              0

dw              jmpSeg

back:                                                                                    ;跳过去后马上回来

pop              ax

mov              ds:[si],ax                                                        ;再恢复下面就是继续执行了

 

    思路就是我们在内存中挖出一个绝对位置的“洞”,然后程序跳进这个洞,这个洞里面

 

放的是返回,一下又回来。只要我们监视这个洞就好了。当然,安全起见,这个洞最后还要

 

再添上。另外,这个洞选择的位置,我只是随便选在600K的位置,其实还可以选择在[40:0]

 

这一片位置,不过我想在虚拟机运行过程中,可能会读这个位置,需要运行几次才可以,

 

操作上比较麻烦就没有选择。

 

    程序做好了命名为bo.asm,编译为bo.exe。格式化一张软盘,放上dos系统的那三个

 

必要的文件,再考上bo.exe. 之后,将软盘做成img文件(我一般用hdcopy).这个img要

 

丢到bochs的目录下,就是下图的目录中。

  

          1.上图,运行bochsdbg

 

     2.选择3,我们要读入bo.img

    3.选择10

   4.选择1

    5.分别输入 bo.img  auto 最后一项直接回车

 

     6.不断回车,一直返回到第一个画面

    7.这个就是第一个画面了,回车,开始运行

    8.开始运行了,会在模拟第一条指令开始的时候停下来

 

  9

.输入 vb 0x9600:0 下断点

 

  10.输入 c 让它继续执行

 

11.模拟器这边就进入dos了~

 

12.运行 bo.exe 看,停在我们设置的断点了。

 

   这个位置也算是程序的开始,下面可以使用s命令跟踪了~

 

 


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐