使用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 # 运行 # 等待程序运行到断点处即可...

__EOF__

本文作者Lht1
本文链接https://www.cnblogs.com/yghr/p/15813969.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   yghr  阅读(411)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示