我想将Bochs用作8086仿真器。是否有捷径可寻?我想要的是像emu8086(http://www.emu8086.com/)。
答案 0 :(得分:8)
如果程序的初始部分适合512字节,并且您不介意将自己限制为BIOS调用,in
/ out
指令,并写入I / O的魔术存储位置......然后是的!
假设你正在使用NASM,这是一个愚蠢的例子......(警告:我的16位装配技能不是很好,有点生锈,所以它可能不是最好的代码。)
[org 7c00h] ; BIOS will load us to this address
mov ax, 0b800h ; Console memory is at 0xb8000; set up a segment
mov es, ax ; for the start of the console text.
;
; Let's clear the screen....
;
xor di, di ; Start at beginning of screen
mov cx, 80*25 ; Number of chars in the screen
mov al, ' ' ; Space character
mov ah, 0fh ; Color (white on black)
repne stosw ; Copy!
;
; Write an 'a' to the screen...
;
mov byte [es:0], 'a' ; Write an 'a'
sleep:
hlt ; Halts CPU until the next external interrupt is fired
jmp sleep ; Loop forever
times 510-($-$$) db 0 ; Pad to 510 bytes
dw 0aa55h ; Add boot magic word to mark us as bootable
然后你可以组装:
nasm foo.asm
并将其写入如下的软盘映像:(假设是一个Unix类型的系统......)
$ dd if=/dev/zero of=floppy.img bs=512 count=2880
$ dd if=foo of=floppy.img conv=notrunc
现在您可以在Bochs中启动该软盘映像(或者,如果您将其写入软盘,在真实PC上运行),它应该在屏幕上写一个“a”。
请注意,这通常仅在您编写引导加载程序或操作系统时才有用......但实验起来很有趣,特别是如果您正在学习。
更新:我读了emu8086网站......似乎有点面向嵌入式使用x86而不是PC。看起来它有一些模拟硬件的有趣功能。如果你对定位PC不感兴趣,那么Bochs就不会有兴趣了。如果这不是您想要做的,我同意建议使用emu8086本身的评论者。
如果您对个人电脑感兴趣但想要通过您的计划,我会经常使用qemu来达到这个目的。它的调试标志(参见-d
下的联机帮助页)足以在程序集级别观察x86程序的执行状态。 (我甚至发现它足以用于调试用C编写的OS内核,前提是您仔细查看C编译器生成的内容。)
答案 1 :(得分:5)
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
在Ubuntu 14.04上工作,Bochs 2.4.6,长度为512字节的引导扇区main.img
。
cylinders=1, heads=1, spt=1
指定磁盘大小,必须匹配您的图像!在这里,我们将所有内容设置为1
以表示1个柱面,这与我们的图像文件一样是512个字节。display_library: sdl
main.img
来自 main.asm :
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
此图像使用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 <(echo ...)
也有效,但使用的Bash扩展名会在我的Makefile上失败QEMU的界面更容易上手,所以我推荐使用它。
使用此示例的GitHub存储库:https://github.com/cirosantilli/x86-bare-metal-examples/blob/cba0757990843f412b14dffad45467ad0034d286/Makefile#L33
答案 2 :(得分:1)
这不是你真正想要做的。 (好吧,也许是......)
基本上,Bochs是x86 PC模拟器。为了在其上执行机器代码,您需要将机器代码设置为“磁盘”映像。磁盘映像是一种结构类似于磁盘(软盘或硬盘驱动器)的文件。
PC具有特定的引导顺序,该序列查看磁盘的各个部分,在那里加载机器代码并执行它。这就是操作系统启动的方式。
让“hello world”在程序集中运行会有点牵扯,坦率地说,因为除了BIOS之外你什么都没有,因为你没有运行的操作系统。
所以,如果你想要追求这个,你就会想要搜索爱好操作系统上的书籍和网站,并了解引导过程是如何工作的,等等。否则,使用类似DOS系统的东西,并创建COM文件从那里开始。