最经看《80x86汇编语言程序设计》杨季文等著,里面的保护模式的例子无法调试,后来查到bochs可以调试,就折腾了一番,这里写下吧……
>>>>>>>>>>>>>>>>>>>>>>>无耻的分割线>>>>>>>>>>>>>>>>>>>>>>>>
下载地址:
Bochs:http://bochs.sourceforge.net/
FreeDOS:http://www.freedos.org/ 这个我下载的1.0,官网上是1.1,一是1.1比1.0大,而是我这1.1安装时卡逼了……1.0装成了……
WinImage:http://www.xdowns.com/soft/6/7/2006/Soft_29274.html 用于将需要的文件加入到虚拟硬盘
接下来是安装:
Bochs没啥说的,就是安装时把那个DLX Linux Demo也选上,后面方便点,这个您随意……安装时选择Install just for me就可以自定义了,安装完后桌面上会出现一个打开简易linux的快捷方式,如果您刚才选择安装了的话
接下来就是配置了
首先打开安装目录,打开bximage.exe创建虚拟硬盘,前两部可以直接摁回车,到了第三步是设置大小的,默认10M……大小您自己看着办吧,别小的装不下系统就好 - -
第四步是给这文件起个名字……您继续随意……但后缀得是.img,然后别着急着关,下面会出现一传参数,它已经给你复制好了,一会你直接复制到配置文件就可以了,下面说下配置文件
如果您装了哪个linux,就把她里面的配置复制过来改改就好,没装的话,您照着bochs安装目录下的bochsrc-sample.txt文件改,别看一大堆,大部分是注释,带#号的都是注释……首先新建个文件夹,例如freedos,将虚拟硬盘、操作系统的iso文件和那个配置文件复制过来,然后改配置文件了
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# how much memory the emulated machine will have
#这是内存的大小
megs: 32
# filename of ROM images
#这是bios文件地址 romimage: file=../BIOS-bochs-latest vgaromimage: file=../VGABIOS-lgpl-latest
# what disk images will be used
#这是设置要使用的软盘驱动器。 floppya: 1_44=floppya.img, status=inserted floppyb: 1_44=floppyb.img, status=inserted
# hard disk
#这是硬盘 ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
# choose the boot disk.
#这是选择启动盘,c表示从“硬盘”启动,这个可是指我们的虚拟硬盘 boot: c
# default config interface is textconfig. #config_interface: textconfig #config_interface: wx
#display_library: x # other choices: win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
# where do we send log messages?
#这个可以不要,是日志文件,不要设置为log:nul log: bochsout.txt
# disable the mouse, since DLX is text only
#是否要鼠标。 mouse: enabled=0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
上面这个是那个linux的配置文件,注释我也从别地抄过来了……接下来把刚才虚拟硬盘那行参数复制到硬盘那里,注释掉原来的
>>>>>>>>>>>>>>>>>>>>>>>>
# hard disk
#这是硬盘 ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 #ata0-master: type=disk, path="hd10meg.img", cylinders=306, heads=4, spt=17
ata0-master: type=disk, path="100M.img", mode=flat, cylinders=203, heads=16, spt=63
ata0-slave: type=cdrom, path="操作系统文件名.iso", status=inserted
>>>>>>>>>>>>>>>>>>>>>
这里改成cdrom,安装完成后再改成c
>>>>>>>>>>>>>>>>>>>>>>>>>
# choose the boot disk. boot: cdrom
>>>>>>>>>>>>>>>>>>>>
接下来打开freedos文件下,也就是您刚创建的文件夹下的bochsrc.bxrc开始安装freedos
执行bochsrc.bxrc,格式化硬盘:
a.Prepare the harddisk for FreeDOS 1.0 Final by running XFdisk,回车后选择OK;
b.继续回车,选择New Partition / Primary Partition,一路YES下去;
c.继续回车,选择Install Bootmanager;
d.按F3,一路YES下去;
5、安装FreeDOS
a.Continue with FreeDOS installation
b.Start installation of FreeDOS 1.0 Final
c.一路YES下去即安装完成;
安装完成后打开配置文件把boot: cdrom这里再改为boot: c即可
运行freedos,进入dos后md新建个文件夹
往里面添加要调试的文件,用winimage打开你创建的那个虚拟硬盘,把文件加入你创建的那个文件夹即可
>>>>>>>>>>>>>>>>>>>>>>万恶的分割线>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
接下来是调试打开bochsdbg.exe,单击Load,载入freedos的配置文件,然后start,就断在那里了,下面给大家一些调试命令和方法
bochsdbg的基本命令:
指令 | 举例 | 说明 |
b addr | b 0x7c00 | 在指定内存物理地址设置断点 |
info b | info b | 查看已经设置了的断定信息 |
d num | d 1 | 删除断点,num为使用info b显示的断点序号 |
c | c | 继续执行,直到遇到下一个断点 |
s | s | 单步执行 |
n | n | 单步执行(遇到函数跳过) |
u start end | u 0x7c00 0x7ca0 | 反汇编一段内存 |
sreg | sreg | 查看寄存器信息(查看GDT与LDT是否加载正确,段寄存器的值等) |
r | r | 查看通用寄存器信息 |
下面是网上找到的一些方法:
第一种:陷阱
在内存某位置挖一个坑,等着我们的程序跳进去。在程序开头处增加一段代码,访问某内存地址,在Bochsdbg里下该地址的内存访问断点。程序一开始运行……等它跳进来的时候抓住它。
详细过程请猛击这里:http://www.aogosoft.com/downpage.asp?mode=viewtext&id=140
第二种:死循环
在程序开头加一句jmp $让我们的程序死循环,在Bochs里执行这个程序,然后在Bochsdbg里按下Ctrl+C,然后修改EIP寄存器的值指向我们的程序入口。
前两种都是在网上找到的,都可行,但是比较麻烦,下面这种是天杀老大教给我的,也是Bochs提供的功能。
在程序开始处添加一句xchg bx,bx,然后在Bochsrc.bxrc文件里添加一句magic_break: enabled=1,然后选择调试启动Bochs虚拟机,当执行到xchg bx,bx指令时就会自动断到Bochsdbg里。
这种方法在Bochsrc_sample.txt文件里有介绍,但我想很多人都跟我一样没仔细看:-)
参考:
http://blog.csdn.net/fazai001/article/details/6694559
http://www.360doc.com/content/12/0108/15/6938655_178090482.shtml