使用Bochs调试汇编程序
使用Bochs调试汇编程序
使用bximage生成镜像
bximage -hd -mode="flat" -size=60 -q test.img
选项:
hd:创建硬盘,-fd表示创建软盘size:镜像大小,单位为MBmode:硬盘模式,可选模式有flat、growing、sparse三种-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\)。

BIOS会在运行过程中去磁盘找到MBR程序,并将控制权交给MBR程序。MBR被载入内存后的位置是0x7c00 ~ 0x7dff。那么只需要在启动bochs后,在0x7c00该位置打一个断点即可。
操作步骤:
6 # 开启仿真模式
b 0x7c00 # 在0x7c00位置开启断点
c # 运行
# 等待程序运行到断点处即可...

浙公网安备 33010602011771号