如何使用Bochs运行汇编代码?

ass*_*ner 7 assembly emulation bochs

我想使用Bochs作为8086模拟器.是否有捷径可寻?我想要的是像emu8086(http://www.emu8086.com/).

asv*_*kau 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
Run Code Online (Sandbox Code Playgroud)

然后你可以组装:

nasm foo.asm
Run Code Online (Sandbox Code Playgroud)

把它写成这样的软盘映像:(假设一个Unix类型的系统......)

$ dd if=/dev/zero of=floppy.img bs=512 count=2880
$ dd if=foo of=floppy.img conv=notrunc
Run Code Online (Sandbox Code Playgroud)

现在你可以在Bochs中启动该软盘映像(或者,如果你将它写入软盘,在真正的PC上运行它),它应该在屏幕上写一个'a'.

请注意,这通常仅在您编写引导加载程序或操作系统时才有用......但实验起来很有趣,特别是如果您正在学习.

更新:我读了emu8086网站......似乎有点面向嵌入式使用x86而不是PC.看起来它有一些模拟硬件的有趣功能.如果你对定位PC不感兴趣,那么Bochs就不会有兴趣了.如果那不是您想要做的,我同意建议使用emu8086本身的评论者.

如果你对PC感兴趣但想要通过你的程序...我经常使用qemu来达到这个目的.它的调试标志(参见下面的手册页-d)足以观察汇编级别的x86程序的执行状态.(我甚至发现它足以用于调试用C编写的OS内核,前提是你仔细查看C编译器生成的内容.)


Cir*_*四事件 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
Run Code Online (Sandbox Code Playgroud)

在Ubuntu 14.04,Bochs 2.4.6和512字节长引导扇区上为我工作main.img

  • cylinders=1, heads=1, spt=1指定磁盘大小,并且必须匹配您的映像!在这里,我们将所有内容都设置1为表示1个柱面,这与我们的图像文件一样为512字节。
  • display_library: sdl由于Ubuntu打包错误,可能需要

main.img是从main.asm生成的:

org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

然后:

nasm -f bin -o main.img main.asm
Run Code Online (Sandbox Code Playgroud)

此图像使用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'
Run Code Online (Sandbox Code Playgroud)

-qf /dev/null部分很难看,但这是我设法自动跳过菜单屏幕的唯一方法:

  • -q-n总是要它,我必须先6争取它才能运行
  • -qn <(echo ...) 也可以,但是使用的Bash扩展名在我的Makefile中失败

QEMU的界面更易于入门,因此我建议改用它。

带有此示例的GitHub存储库:https : //github.com/cirosantilli/x86-bare-metal-examples/blob/cba0757990843f412b14dffad45467ad0034d286/Makefile#L33


Wil*_*ung 2

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

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

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

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

因此,如果您想追求这一点,您将需要寻找有关业余操作系统的书籍和网站,并了解引导过程如何工作等。否则,请使用 DOS 系统之类的系统,创建 COM 文件并从那里。