dos下调试汇编程序

前言

最近在看操作系统的实现过程,目前正在看实模式和保护模式这块,实模式下的16位汇编程序有时候会需要调试,于是准备在dos下使用debug进行调试,本文主要记录调试过程中遇到的一些坑

dos环境搭建

过程可以参考怎么在 Linux 中运行 DOS 程序
简化过程如下:

1. 使用qemu-img创建一个虚拟磁盘

qemu-img create dos.img 200M,第一次使用这个命令,使用hexdump查看可以发现里面的内容全部都是0,文件类型为data(就是一个dd命令创建一个全为0的文件)

2. qemu选项:

qemu-system-i386 -m 16 -k en-us -rtc base=localtime -soundhw sb16,adlib -device cirrus-vga -display gtk -hda dos.img -cdrom FD12CD.iso -boot order=d
这个选项看起来很长,简单解释就是创建一个内存为16m(-m 16),具有一个硬盘(hda dos.img)dos.img和一个cd-rom(cdrom FD12CD.ISO)的虚拟机,两个盘分别挂载到dos的c盘(dos.img)d盘(FD12CD.ISO)上。至于-boot order=d选项是指定启动盘为d盘也就是从下载好的iso文件启动,因为这个时候c盘还是空的。

3. 安装dos

安装很简单,一直按yes就ok了,中间会提示你挂载的c盘需要格式化为特定的格式(后面看了一下是格式化为FAT16文件系统)

4. 启动dos

启动选项和之前的安装选项差不多,只不过这里不需要cd-rom了,dos已经安装在了我们的硬盘dos.img上了,因此把启动盘改为c盘就好了
qemu-system-i386 -m 16 -k en-us -rtc base=localtime -soundhw sb16,adlib -device cirrus-vga -display gtk -hda dos.img -drive file=fat:rw:dosfiles/ -boot order=c
plus:-drive file=fat:rw:dosfiles/是将dosfiles这个文件夹挂载到dos的d盘上作为与linux共享文件的介质

程序调试

坑点

  1. 以前学汇编的时候是使用的masm+link来编译链接写好的汇编代码为可执行文件,参考的三本书中,第一本汇编语言(第三版 王爽著)这本书上面使用的也是这种方法。但是第二本linux0.11内核完全注释当中,bootsect.s和setup.s使用的是as86和ld86编译链接,第三本参考书自己动手写操作系统使用的nasm编译为bin文件,不链接。一开始使用的as86和ld86在linux下编译链接后放到dos中运行,程序如下:
    在这里插入图片描述
    直接在dos下运行会输出乱码,我猜测可能是数据段设置与实际不一样导致找不到BootMsg,所以输出了错误的内存数据,使用debug调试会卡在mov sp, #0x180,后面就没办法运行了,dos提示file not found然后就卡死了,查资料也没找到什么原因。最后还是放弃了这种方法
  2. 使用nasm编译为纯二进制文件直接运行,放入dos中调试也是输出乱码,好在nasm文档较多,同时nasm也自带了一个ndisasm反汇编工具可以查看反汇编结果,最开始的程序如下(就差了这个第一行):
    在这里插入图片描述
    反汇编的结果:
    在这里插入图片描述
    其中BootMsg的偏移量为26,int10 13功能号对应的子程序调用使用es:bp作为字符串首地址,输出乱码的原因应该就是字符串首地址错了。

plus:
在这里插入图片描述

解决方案

dos中debug运行:
在这里插入图片描述
细心点可以发现初始ip = 0100,而我们使用nsam编译的程序是从0地址开始的,所以只要指定程序起始有0100的偏移就好了,以上程序去掉第一行的注释,再次编译运行就OK了
在这里插入图片描述
(看书不仔细,调试两行泪)
在这里插入图片描述
随便找了一个answer:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/adventural/article/details/107903508