9

我想将 Bochs 用作 8086 仿真器。是否有捷径可寻?我想要的是类似emu8086(http://www.emu8086.com/)的东西。

4

3 回答 3

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 本身的评论者。

如果您对 PC 感兴趣,但想要逐步完成您的程序...我经常为此目的使用 qemu。它的调试标志(参见参考资料下的手册页-d)足以在汇编级别观察 x86 程序的执行状态。(我什至发现它对于调试用 C 编写的 OS 内核非常有用,只要您非常仔细地查看 C 编译器生成的内容。)

于 2011-05-26T19:18:48.833 回答
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由于Ubuntu 打包错误,可能需要

main.imgmain.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

于 2015-09-30T17:08:34.487 回答
1

这不是你真正想做的。(嗯,也许是……)

基本上,Bochs 是一个 x86 PC 模拟器。为了在上面执行机器代码,您需要将机器代码放到“磁盘”映像上。磁盘映像是一个结构类似于磁盘(软盘或硬盘驱动器)的文件。

PC 有一个特定的启动顺序,它查看磁盘的各个部分,在那里加载机器代码并执行它。这就是操作系统的启动方式。

坦率地说,让“hello world”在汇编中运行会有点麻烦,因为除了 BIOS 之外你什么都没有,因为你没有操作系统可以在上面运行。

所以,如果你想追求这个,你会想要寻找关于爱好操作系统的书籍和网站,并了解引导过程是如何工作的,等等。否则,使用类似 DOS 系统的东西,并创建 COM 文件并从那里。

于 2011-05-26T17:58:50.510 回答