Quiero usar Bochs como un emulador 8086. ¿Hay una forma fácil de hacer esto? Lo que quiero es algo como emu8086 (http://www.emu8086.com/).¿Cómo puedo usar Bochs para ejecutar el código de ensamblado?
Respuesta
Eso no es lo que realmente quieres hacer. (Bueno, tal vez es ...)
Básicamente, Bochs es un emulador de PC x86. Para ejecutar código de máquina en eso, necesita obtener el código de máquina en una imagen de "disco". Una imagen de disco es un archivo que está estructurado como un disco (un disquete o disco duro).
La PC tiene una secuencia de inicio específica que mira las secciones del disco, carga el código de máquina allí y lo ejecuta. Así es como se inicia el sistema operativo.
Conseguir que "hello world" se ejecute en conjunto será un poco complicado, francamente, ya que no tendrá nada más que el BIOS, ya que no tendrá un sistema operativo para ejecutar.
Por lo tanto, si desea seguir esto, querrá buscar libros y sitios en sistemas operativos hobbies y aprender cómo funciona el proceso de arranque, etc. De lo contrario, trabaje con algo así como un sistema DOS y cree COM archivos e ir desde allí.
Gracias. Estaba pensando en la misma línea ... probaré DOSBox. – assemblylearner
No es realmente difícil escribir Hola mundo como un sector de arranque. Vea mi respuesta, que lo llevará la mayor parte del camino hasta allí. – asveikau
Si la parte inicial de su programa encaja en 512 bytes, y no le importa restringirse a las llamadas al BIOS, in
/out
instrucciones, y escribir en ubicaciones de memoria mágica para E/S ... ¡Entonces sí!
Suponiendo que está usando NASM, aquí hay un ejemplo tonto ... (Advertencia: mis conocimientos de montaje de 16 bits no son muy grandes y el tipo de oxidado, por lo que podría no ser la mejor código.)
[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
a continuación, se puede montar con:
nasm foo.asm
Y escribir esto a una imagen del disco de la siguiente manera: (Suponiendo un sistema de tipo Unix ...)
$ dd if=/dev/zero of=floppy.img bs=512 count=2880
$ dd if=foo of=floppy.img conv=notrunc
Ahora puede iniciar esa imagen de disquete en Bochs (o, si lo escribe en un disquete, ejecutarlo en una PC real) y debe escribir una 'a' en la pantalla.
Tenga en cuenta que esto normalmente solo es útil si está escribiendo un gestor de arranque o un sistema operativo ... Pero es divertido experimentar, especialmente si está aprendiendo.
Actualización: He leído el sitio web emu8086 ... Parece algo orientado al uso integrado de x86 en lugar de una PC. Parece que tiene algunas características interesantes para simular hardware. Si no está interesado en la orientación de PC, entonces Bochs no le interesará. Si eso no es lo que quieres hacer, estoy de acuerdo con el comentarista que sugirió usar emu8086.
Si le interesan las PC pero quiere algo que lo guíe a través de sus programas ... A menudo he usado qemu para este propósito. Sus indicadores de depuración (consulte la página de manual bajo -d
) son suficientes para observar el estado de ejecución de un programa x86 en el nivel de ensamblaje. (Incluso he encontrado bastante útil para depurar los núcleos OS escritos en C, siempre se mira con mucho cuidado lo que genera el compilador de C.)
Gracias por su aporte. Creo que emu8086/DOS DEBUG será más adecuado para mi propósito. – assemblylearner
puede iniciarlo en qemu de la siguiente manera: '' qemu-system-x86_64 -hda floppy.img'' –
¿Qué hago si mi programa es más grande que 512 bytes? –
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
trabajó para mí en Ubuntu 14.04, Bochs 2.4.6 con un 512 sector de arranque largo byte main.img
.
cylinders=1, heads=1, spt=1
especifica el tamaño del disco, y debe coincidir con su imagen! Aquí establecemos todo en1
para que signifique 1 cilindro, que es 512 bytes, como nuestro archivo de imagen.display_library: sdl
puede ser necesaria debido a un Ubuntu packaging bug
main.img
se generó a partir main.asm:
org 0x7c00
bits 16
cli
mov ax, 0x0E61
int 0x10
hlt
times 510 - ($-$$) db 0
dw 0xaa55
continuación:
nasm -f bin -o main.img main.asm
Estas imágenes utiliza el BIOS para impresión un solo personaje a
al scre es
Es posible evitar la creación del archivo .bochsrc
mediante la siguiente línea de comandos:
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'
La parte -qf /dev/null
es feo, pero es la única forma que he conseguido saltar automáticamente el menú pantalla:
-q
o-n
siempre pregunte por ella, y tengo que golpear6
para que se ejecute después-qn <(echo ...)
también trabajó, pero utiliza una extensión Bash, que fracasaría en mi Makefile
interfaz de QEMU era más fácil para empezar con, por lo que recomendamos que se use en su lugar.
repositorio GitHub con este ejemplo: https://github.com/cirosantilli/x86-bare-metal-examples/blob/cba0757990843f412b14dffad45467ad0034d286/Makefile#L33
- 1. ¿Cómo ejecutar el ensamblado en gdb directamente?
- 2. Usar una acción asíncrona para ejecutar el código síncrono
- 3. ¿Cómo puedo usar el código C++ para interactuar con PHP?
- 4. ¿Puedo usar DoxyGen para documentar el código de ActionScript?
- 5. Force Pex para ignorar el código generado, ¿puedo hacerlo sin una referencia al ensamblado de Pex?
- 6. Ver tanto el código de ensamblado como el código C
- 7. ejecuta un código de ensamblado en ubuntu
- 8. ¿Puedo usar el reflejo para inspeccionar el código en un método?
- 9. ¿Cómo puedo probar el código que nunca se debe ejecutar?
- 10. ¿Cómo puedo ejecutar el código de inicialización para una función de generador inmediatamente, en lugar de ejecutar la primera llamada?
- 11. ¿Puedo convertir el siguiente código para usar genéricos?
- 12. ¿Cómo obtener el código c para ejecutar el bytecode hexadecimal?
- 13. ¿Cómo ejecutar el código C++ sin compilarlo?
- 14. ¿Puedo compilar y ejecutar la expresión de C# sin guardar el ensamblado en el disco?
- 15. ¿Cómo ejecutar el código de inicialización para una paleta?
- 16. ¿Cómo usar el ensamblado .Net de Win32 sin registro?
- 17. ¿Cómo puedo usar NSRange con enteros para simplificar mi código?
- 18. Use DLR para ejecutar el código generado con CompileAssemblyFromSource?
- 19. ¿Cómo puedo usar código común en python?
- 20. Conversión del código de ensamblado al código C
- 21. Cómo escribir código de auto modificación en ensamblado x86
- 22. ¿Puedo ejecutar el código de MATLAB en un sitio web?
- 23. ¿Cómo puedo ejecutar código almacenado en una base de datos?
- 24. ¿Cómo puedo usar el código Delphi desde una aplicación C#?
- 25. ¿Cómo puedo ver el árbol de análisis sintáctico, el código intermedio, el código de optimización y el código de ensamblado durante la compilación?
- 26. ¿Cómo puedo ejecutar vim para ejecutar perltidy en un buffer?
- 27. que java (s) no solar puedo usar para ejecutar Clojure?
- 28. Cómo configurar SQLite para ejecutar con NHibernate donde el ensamblado resuelve System.Data.SQLite?
- 29. ¿Cómo puedo hacer que el código externo sea 'seguro' para ejecutar? Solo ban eval()?
- 30. ¿Cómo usar DLL de ensamblado .NET precompilado en Mono?
Por qué no utilizar Emu8086? –