如何使用Bochs运行程序集代码



我想使用Bochs作为8086模拟器。有简单的方法吗?我想要的是类似emu8086的东西(http://www.emu8086.com/)。

如果程序的初始部分适合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编写的操作系统内核非常有用,只要你仔细查看C编译器生成的内容。)

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字节,就像我们的图像文件一样
  • 由于Ubuntu打包错误,可能需要display_library: sdl

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

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

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

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

坦率地说,让"helloworld"在程序集中运行会有点麻烦,因为除了BIOS,你什么都没有,因为你没有操作系统可以在上面运行。

因此,如果你想追求这一点,你会想找到关于业余操作系统的书籍和网站,了解引导过程是如何工作的,等等。否则,使用DOS系统之类的系统,创建COM文件,然后从那里开始。

相关内容

  • 没有找到相关文章

最新更新