Domanda "Hello World" bare metal

mattstack

Utente Bronze
1 Aprile 2021
62
19
12
46
Salve, sto provando a creare un piccolo programmino bare metal, un semplice "hello world" tramite i servizi del BIOS relativi al video, non su hardware reale bensì su qemu, il fatto e che non so dove mettere le mani, o meglio ci ho provato ma ho inevitabilmente fallito.
Il codice è il seguente:
Codice:
stack SEGMENT PARA STACK

      db      ?

stack ENDS

data SEGMENT PARA PUBLIC

     msg     db     "Hello World"

data ENDS

code SEGMENT PARA PUBLIC

      ASSUME cs: code, ss: stack, ds: data

_start:
      mov      ax, data
      mov      ds, ax

      mov     cx, LENGHT msg
      mov     si, OFFSET msg

      lp:  mov      ah, 0Eh
            mov      al, BYTE PTR [si]
            int         10h
            inc        si
            loop      lp

     hlt

code ENDS
        END _start
E fin qui, no problemi, a questo punto creo un immagine del disco:
Codice:
qemu-img create main.img 512B
tramite un editor esadecimale inserisco i due byte "magici" 0x55 e 0xAA al byte 511 e 512 dell'immagine del disco, per far si che il BIOS consideri il settore avviabile, e prima di quest'ultimi memorizzo il programma, riempendo la distanza in byte tra l'ultima istruzione e i due byte magici con 0x20.
Ottenendo il seguente risultato:
Schermata del 2021-05-02 14-16-10.png

Non vedo niente di sbagliato, il BIOS emulato leggerà il settore, troverà i byte magici, e caricherà in memoria il settore, che quindi verrà eseguito.
Invece, questo è il risultato:
Schermata del 2021-05-02 14-25-36.png

Non, capisco, il settore è avviabile, credo di si, il fatto e che non visualizza niente.
Qualcuno può darmi un aiuto e qualche dritta?
 

Allegati

  • Schermata del 2021-05-02 14-18-33.png
    Schermata del 2021-05-02 14-18-33.png
    4.3 KB · Visualizzazioni: 4
  • Schermata del 2021-05-02 14-18-44.png
    Schermata del 2021-05-02 14-18-44.png
    44.6 KB · Visualizzazioni: 5
Salve, sto provando a creare un piccolo programmino bare metal, un semplice "hello world" tramite i servizi del BIOS relativi al video, non su hardware reale bensì su qemu, il fatto e che non so dove mettere le mani, o meglio ci ho provato ma ho inevitabilmente fallito.
Il codice è il seguente:
Codice:
stack SEGMENT PARA STACK

      db      ?

stack ENDS

data SEGMENT PARA PUBLIC

     msg     db     "Hello World"

data ENDS

code SEGMENT PARA PUBLIC

      ASSUME cs: code, ss: stack, ds: data

_start:
      mov      ax, data
      mov      ds, ax

      mov     cx, LENGHT msg
      mov     si, OFFSET msg

      lp:  mov      ah, 0Eh
            mov      al, BYTE PTR [si]
            int         10h
            inc        si
            loop      lp

     hlt

code ENDS
        END _start
E fin qui, no problemi, a questo punto creo un immagine del disco:
Codice:
qemu-img create main.img 512B
tramite un editor esadecimale inserisco i due byte "magici" 0x55 e 0xAA al byte 511 e 512 dell'immagine del disco, per far si che il BIOS consideri il settore avviabile, e prima di quest'ultimi memorizzo il programma, riempendo la distanza in byte tra l'ultima istruzione e i due byte magici con 0x20.
Ottenendo il seguente risultato:
Visualizza allegato 52413
Non vedo niente di sbagliato, il BIOS emulato leggerà il settore, troverà i byte magici, e caricherà in memoria il settore, che quindi verrà eseguito.
Invece, questo è il risultato:
Visualizza allegato 52417
Non, capisco, il settore è avviabile, credo di si, il fatto e che non visualizza niente.
Qualcuno può darmi un aiuto e qualche dritta?

Ciao, dai un occhio a questo esempio, direi faccia al caso tuo, leggi qui: https://stackoverflow.com/questions...-world-boot-sector-with-gcc-that-works-from-a
Non molto, si parla di hardware reale, io non sono riuscito a farlo "partire" su qemu, ho visto un po' in giro, ma la maggior parte delle persone ha fatto quello che ho fatto io, mi sono perso qualcosa probabilmente.