2011-05-26 12 views

Respuesta

1

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í.

+0

Gracias. Estaba pensando en la misma línea ... probaré DOSBox. – assemblylearner

+1

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

7

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.)

+0

Gracias por su aporte. Creo que emu8086/DOS DEBUG será más adecuado para mi propósito. – assemblylearner

+0

puede iniciarlo en qemu de la siguiente manera: '' qemu-system-x86_64 -hda floppy.img'' –

+0

¿Qué hago si mi programa es más grande que 512 bytes? –

3
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 en 1 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 golpear 6 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

Cuestiones relacionadas