Sto scrivendo la funzione in modalità reale, che dovrebbe essere normale con gli stackframes e così, ma dovrebbe utilizzare% sp anziché% esp. C'è un modo per farlo?Come comunicare a GCC di generare codice a 16 bit per la modalità reale
risposta
Per quanto ne so, GCC non supporta la generazione di codice per x86 a 16 bit. Per bootloader legacy e scopi simili, dovresti scrivere un piccolo stub in linguaggio assembly per mettere la cpu in modalità a 32 bit e passare l'esecuzione al codice a 32 bit. Per altri scopi, non dovresti scrivere codice a 16 bit.
Spiegherebbe molto di più. Che dire dell'opzione -m16? –
GCC non produce codice 8086. La direttiva GNU AS .code16gcc
può essere utilizzata per assemblare l'output di GCC per l'esecuzione in modalità a 16 bit, inserire asm(".code16gcc")
all'inizio della sorgente C, il programma sarà limitato a 64 KB.
Documentato su: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –
L'uso di .code16gcc (non sono ancora sicuro che si possa chiamare una funzione stabile) produrrà il codice che viene eseguito a 16 bit modalità reale, tuttavia utilizza un prefisso di istruzioni disponibile solo su 386+. Questo significa che se stai bersagliando 8086/8088 (vero hardware o emulatore), il codice probabilmente non funzionerà correttamente. Se si intende eseguire il bootstrap della voce nella modalità protetta a 32 bit, scrivere un piccolo stub assembler a 16 bit che imposta tutto, entra in modalità protetta e quindi chiama una funzione "C" a 32 bit che è l'inizio del programma. –
Puoi ovviamente assemblare a 16 bit il codice mano in GCC come assemblaggio in linea usando la direttiva __asm__. –
GCC 5.2.0 (e le versioni precedenti possibili) supportano la generazione di codice a 16 bit con il flag -m16
. Tuttavia, il codice si baserà quasi certamente su funzionalità del processore a 32 bit (come i registri a 32 bit di larghezza), quindi è necessario verificare attentamente il gruppo generato.
Dalle man
pagine:
L'opzione -m16 è uguale a -m32, tranne che emetta la direttiva assemblaggio ".code16gcc" all'inizio dell'output complesso modo che la binario può funzionare in modalità a 16 bit.
Quale sistema operativo deve funzionare? GCC non supporta MS-DOS. –