Assembly 如何使用Bochs运行汇编代码?
我想使用Bochs作为8086仿真器。有没有一个简单的方法可以做到这一点?我想要的是emu8086()。这不是您真正想要的。(嗯,也许是…) 基本上,Bochs是一个x86 PC仿真器。为了在上面执行机器代码,您需要将机器代码放到“磁盘”映像上。磁盘映像是一种结构类似于磁盘(软盘或硬盘驱动器)的文件 PC有一个特定的引导序列,它查看磁盘的各个部分,在那里加载机器代码并执行。这就是操作系统的启动方式 坦白地说,让“hello world”在汇编中运行会有点麻烦,因为除了BIOS之外,你什么都没有,因为你没有操作系统可以在上面运行Assembly 如何使用Bochs运行汇编代码?,assembly,emulation,bochs,Assembly,Emulation,Bochs,我想使用Bochs作为8086仿真器。有没有一个简单的方法可以做到这一点?我想要的是emu8086()。这不是您真正想要的。(嗯,也许是…) 基本上,Bochs是一个x86 PC仿真器。为了在上面执行机器代码,您需要将机器代码放到“磁盘”映像上。磁盘映像是一种结构类似于磁盘(软盘或硬盘驱动器)的文件 PC有一个特定的引导序列,它查看磁盘的各个部分,在那里加载机器代码并执行。这就是操作系统的启动方式 坦白地说,让“hello world”在汇编中运行会有点麻烦,因为除了BIOS之外,你什么都没有,
因此,如果你想继续这样做,你需要查找有关业余操作系统的书籍和网站,了解引导过程是如何工作的,等等。否则,使用DOS系统之类的东西,创建COM文件并从那里开始。如果程序的初始部分适合512字节,您不介意将自己限制在BIOS调用、
输入
/输出
指令,以及写入魔法内存位置以进行I/O。。。那么是的
假设您正在使用NASM,下面是一个愚蠢的示例。。。(警告:我的16位汇编技能不是很好,有点生疏,所以它可能不是最好的代码。)
然后,您可以使用以下工具进行组装:
nasm foo.asm
并将其写入软盘映像,如下所示:(假设是Unix类型的系统…)
现在,您可以在Bochs中启动该软盘映像(或者,如果您将其写入软盘,请在真正的PC上运行),它应该会在屏幕上写入“a”
请注意,这通常仅在编写引导加载程序或操作系统时有用。。。但是做实验是很有趣的,尤其是当你在学习的时候
更新:我读了emu8086网站。。。似乎有点面向x86的嵌入式应用,而不是PC。它似乎有一些有趣的模拟硬件的功能。如果你对个人电脑不感兴趣,那么Bochs也不会感兴趣。如果你不想这样做,我同意评论者的意见,他建议使用emu8086本身
如果你对个人电脑感兴趣,但想在你的程序中加入一些东西。。。为此,我经常使用qemu。它的调试标志(请参阅-d
下的手册页)足以在程序集级别观察x86程序的执行状态。(我甚至发现它对于调试用C编写的操作系统内核非常有用,只要您仔细查看C编译器生成的内容即可。)
在Ubuntu 14.04、Bochs 2.4.6上为我工作,有512字节长的引导扇区main.img
指定磁盘大小,并且必须与您的映像匹配!在这里,我们将所有内容设置为columns=1,heads=1,spt=1
,表示1个圆柱体,与图像文件类似,为512字节1
,因为显示\u库:可能需要sdl
main.img
是从main.asm生成的:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
然后:
此图像使用BIOS将单个字符a
打印到屏幕上
使用以下命令行可以避免创建.bochsrc
文件:
bochs \
-qf /dev/null \
'ata0-master: type=disk, path="main.img", mode=flat, cylinders=1, heads=1, spt=1' \
'boot: disk' \
'display_library: sdl' \
'megs: 128'
-qf/dev/null
部分很难看,但这是我成功地自动跳过菜单屏幕的唯一方法:
或-q
总是要求它,我必须点击-n
之后才能运行它6
-qn谢谢。我也是这么想的。。。我会试试DOSBox。把hello world作为引导扇区来编写其实并不难。请看我的答案,这将为您提供大部分信息。谢谢您的输入。我认为emu8086/DOS调试更适合我的目的。你可以像这样在qemu中引导它:
如果我的程序大于512字节,我该怎么办?@JanusTroelsen-那么它就不适合引导扇区。您需要编写适合512字节的代码,以便能够从磁盘上的其他位置加载其余代码。qemu-system-x86_64-hda floppy.img
sudo apt-get install bochs bochs-sdl printf 'ata0-master: type=disk, path="main.img", mode=flat, cylinders=1, heads=1, spt=1 boot: disk display_library: sdl megs: 128 ' > .bochsrc bochs -q
org 0x7c00 bits 16 cli mov ax, 0x0E61 int 0x10 hlt times 510 - ($-$$) db 0 dw 0xaa55
nasm -f bin -o main.img main.asm
bochs \ -qf /dev/null \ 'ata0-master: type=disk, path="main.img", mode=flat, cylinders=1, heads=1, spt=1' \ 'boot: disk' \ 'display_library: sdl' \ 'megs: 128'