Domanda

Sto cercando di utilizzare il video BIOS interrupt per visualizzare un carattere sullo schermo. Quanto segue è il codice assembly:

mov $0x0A, %AH
mov $0x68, %AL ; to display character 'h'
int $0x10

I assemblato questo codice utilizzando GNU assembler per produrre un file oggetto chiamato sample.o La dimensione totale di sample.o è 449 byte. Ora scrivo manualmente a questo file oggetto le cifre esadecimali 0x55 e 0xAA a posizioni di byte 511 ° e 512th al fine di renderla avviabile. Quindi credo che ora ho un settore di boot 512 byte. Io uso QEMU per cercare di avvio da questo file oggetto:

$> qemu -fda sample.o

I QEMU emulatore si avvia e si blocca nel punto in cui si dice "Avvio da floppy ..." Ma ho pensato dopo aver rilevato il settore di avvio è stato supposto il video BIOS interrupt codice per eseguire e visualizzare un carattere sullo schermo.

So che sto facendo qualcosa di terribilmente sbagliato. Forse mi manca l'intero concetto di interrupt. Chiunque può aiutare.

EDIT: così Ora sto utilizzando as86 e ld86 per produrre solo il binario piatta. E invece di 0x0A in AH sto usando 0x0E e sembra come ha fatto il trucco. Sembra problema di implementazione del BIOS.

Apprezzo tutti coloro che hanno risposto di nuovo.

Grazie

È stato utile?

Soluzione

Un file .o normale contiene un po 'diverso da solo il codice binario risultante, quindi non è una sorpresa che quello che stai facendo non funziona (il risultato di questo dovrebbe essere di circa 10 byte o giù di lì).

È possibile scrivere uno script per ld per arrivare a produrre un binario piatta (mi sembra di ricordare che dovrebbe essere possibile, ma non ho provato personalmente). Se fossi facendo questo, probabilmente sarei usare NASM invece, dal momento che può produrre un output binario non elaborato piuttosto facilmente. Un'altra possibilità potrebbe essere alcuni vecchi MS-DOS assemblatore di grado di produrre output in formato .com (che è anche binario non elaborato, anche se bisogna stare attenti, in quanto si carica un po 'diverso).

Altri suggerimenti

È necessario passare il valore dell'attributo a BL (07h è grigio su nero), il numero di pagina in BH e contare in CX.

Tu dici è stato compilato con il gas e ti ha dato un file di 448 byte? Stai assemblando in un file ELF o qualcosa del genere? Mi consiglia nasm bin -f, usando la direttiva 16 BITS.

Come ha detto Jerry Coffin, il problema è che il file .o non è un'immagine floppy con un settore di avvio corretta. Il file .o contiene un sacco di informazioni oltre al codice, come i nomi dei simboli e informazioni delocalizzazione.

Se si utilizza NASM, uso -f bin per produrre un binario non elaborato. Se si utilizza LD, è possibile scrivere uno script del linker.

Per informazioni su questo tipo di cose, il posto migliore è probabilmente osdev.org e il suo forum .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top