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

Assembly 如何使用Bochs运行汇编代码?,assembly,emulation,bochs,Assembly,Emulation,Bochs,我想使用Bochs作为8086仿真器。有没有一个简单的方法可以做到这一点?我想要的是emu8086()。这不是您真正想要的。(嗯,也许是…) 基本上,Bochs是一个x86 PC仿真器。为了在上面执行机器代码,您需要将机器代码放到“磁盘”映像上。磁盘映像是一种结构类似于磁盘(软盘或硬盘驱动器)的文件 PC有一个特定的引导序列,它查看磁盘的各个部分,在那里加载机器代码并执行。这就是操作系统的启动方式 坦白地说,让“hello world”在汇编中运行会有点麻烦,因为除了BIOS之外,你什么都没有,

我想使用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
    ,表示1个圆柱体,与图像文件类似,为512字节
  • 显示\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中引导它:
    qemu-system-x86_64-hda floppy.img
    如果我的程序大于512字节,我该怎么办?@JanusTroelsen-那么它就不适合引导扇区。您需要编写适合512字节的代码,以便能够从磁盘上的其他位置加载其余代码。
    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'