我想使用Bochs作为8086模拟器。是否有捷径可寻?我想要的是类似emu8086(http://www.emu8086.com/)。如何使用Bochs来运行汇编代码?
回答
这不是你真正想要做的。 (嗯,也许这是...)
基本上,Bochs是x86 PC模拟器。为了在其上执行机器代码,您需要将机器代码置于“磁盘”映像上。磁盘映像是一个像磁盘(软盘或硬盘)结构的文件。
PC有一个特定的引导顺序,它查看磁盘的各个部分,在那里加载机器代码并执行它。这是操作系统启动的方式。
坦率地说,让“hello world”在程序集中运行会有点牵扯,因为除了BIOS之外你什么都没有,因为你不会有一个操作系统在其上运行。
因此,如果你想追求这个目标,你会想要在爱好操作系统上搜索书籍和网站,并学习引导过程如何工作等。否则,使用类似于DOS系统的东西,并创建COM文件并从那里去。
谢谢。我正在考虑沿着同一条线......我会尝试DOSBox。 – assemblylearner 2011-05-26 18:07:43
把你好的世界写成引导扇区并不难。看到我的答案,这会让你走到最后。 – asveikau 2011-05-26 20:13:15
如果您的程序的初始部分适合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。它看起来像有一些有趣的功能来模拟硬件。如果你对瞄准电脑不感兴趣,那么Bochs不会感兴趣。如果这不是你想要做的,我同意那个建议使用emu8086本身的评论者。
如果您对电脑感兴趣,但希望通过您的程序步骤......我经常使用qemu来达到此目的。它的调试标志(参见-d
下的手册页)足以在组件级别观察x86程序的执行状态。 (我甚至发现它用于调试C语言编写的操作系统内核足够有用的,只要你仔细看的C编译器生成的。)
感谢您的意见。我认为emu8086/DOS DEBUG会更适合我的目的。 – assemblylearner 2011-05-30 22:25:34
你可以像这样在qemu中启动它:''qemu-system-x86_64 -hda floppy.img'' – 2012-07-26 12:25:26
如果我的程序大于512字节,该怎么办? – 2012-07-26 12:33:05
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个字节。org 0x7c00 bits 16 cli mov ax, 0x0E61 int 0x10 hlt times 510 - ($-$$) db 0 dw 0xaa55
然后::
display_library: sdl
可以因为的Ubuntu packaging bug
main.img
需要从main.asm中产生
nasm -f bin -o main.img main.asm
该图像使用BIOS来打印单个字符a
到scre恩。
有可能通过使用下面的命令行,以避免.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
- 1. 汇编 - 在bochs中运行bootloader的问题
- 2. 在ubuntu上运行汇编代码
- 3. 如何在FASM中运行汇编代码
- 4. 如何在nasm上运行此汇编代码?
- 5. 汇编代码
- 6. 如何编译汇编代码?
- 7. 如何编译64位汇编代码
- 8. 用python执行汇编代码
- 9. 使用as88汇编器从汇编代码调用C函数
- 10. 如何使用GCC将C代码编译为8088汇编?
- 11. 来自visual studio的反汇编代码
- 12. 如何从命令提示符编译并运行汇编源代码?
- 13. C++汇编代码
- 14. GMP-汇编代码?编译代码
- 15. 汇编&C - 翻译C'S代码汇编
- 16. 使用Kdbg调试汇编代码
- 17. 使用PIC16F877闪烁LED - 汇编代码
- 18. 如何编译高级代码以获取汇编代码?
- 19. 如何在应用程序启动时执行汇编代码
- 20. 如何让cgdb显示汇编代码?
- 21. 汇编代码生成如何工作?
- 22. 如何组织汇编代码?
- 23. 如何反汇编原始MIPS代码?
- 24. 如何反汇编原始x86代码?
- 25. 如何分析的CPP /汇编代码
- 26. 如何正确反汇编.NET代码?
- 27. 如何使用编码运行rdlc
- 28. 汇编代码跳过一行?
- 29. 日志汇编代码执行
- 30. 如何使用Crawljax运行JavaScript代码
为什么不直接使用emu8086? – 2011-05-26 18:06:10