使用Bochs调试汇编程序

使用Bochs调试汇编程序

使用bximage生成镜像

bximage -hd -mode="flat" -size=60 -q test.img

选项:

  • hd:创建硬盘,-fd表示创建软盘
  • size:镜像大小,单位为MB
  • mode:硬盘模式,可选模式有flatgrowingsparse三种
  • -q:静默模式

将生成语句写入对应的bochs配置文件,例如:

ata0-master: type=disk, path="test.img", mode=flat, cylinders=121, heads=16, spt=63

写入MBR,在Bochs中运行汇编程序

一般计算机启动时会启动BIOS,BIOS会去磁盘的第一扇区上找对应的MBR程序。因此想在一个裸机上直接运行汇编程序,那么就需要将汇编程序写入到磁盘分区起始块的一个扇区(512KB)上即可。

可以通过fdisk -l命令来查看扇区大小。

;;;;;;;;;;;;;;;
;; your code ;;
;;;;;;;;;;;;;;;

; 死循环,CPU一直停留在此行
jmp $

; $: 表示当前指令所在地址
; $$: 表示当前段的起始地址
; times 表示重复某个指令n次
; 一个扇区的大小一般是512KB
; 当你的代码不足512KB时剩下的就需要0来填充
; db 0就是写入一个字节的0x0
; 为什么不是512而是510呢?
; 因为MBR程序最后需要留两个字节来写入魔数0xaa55
times 510-($-$$) db 0

; MBR程序最后两个字节必须为0xaa55,由于Linux下为小端序,因此先写55再写aa
db 0x55, 0xaa

使用nasm编译

nasm -o mbr.bin mbr.asm

使用dd命令写入镜像

这里假设你的镜像为test.img,你的程序为mbr.bin

dd if=/your_path/mbr.bin of=/your_path/test.img bs=512 count=1 conv=notrunc

解释以下:

dd是一个磁盘操作命令,用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

选项:

  • if:输入文件

  • of:输出(被写入)文件

  • bs:指定块的大小,单位KB

  • count:写入次数

  • skip:表示输入文件跳过n个块

  • seek:表示输出文件跳过n个块,注意单位为块

  • append:追加模式

  • conv:转换文件,可选参数如下表

    参数 含义
    lcase 把小写字符转换为大写字符
    ucase 把小写字符转换为大写字符
    swab 交换输入的每对字节
    noerror 出错时不停止
    notrunc 不截短输出文件

实模式下1MB的内存布局

在实模式下,CPU能访问的内存空间最多只有1MB,即\(address = cs << 4 + ip\)

实模式下1MB内存布局

BIOS会在运行过程中去磁盘找到MBR程序,并将控制权交给MBR程序。MBR被载入内存后的位置是0x7c00 ~ 0x7dff。那么只需要在启动bochs后,在0x7c00该位置打一个断点即可。

操作步骤:

6        # 开启仿真模式
b 0x7c00 # 在0x7c00位置开启断点
c        # 运行
         # 等待程序运行到断点处即可...
posted @ 2022-01-17 16:16  yghr  阅读(475)  评论(0)    收藏  举报