Miscelazione codice a 32 bit e a 16 bit con nasello


5

Questa è una domanda di sistema di basso livello.

Ho bisogno di mixare codice a 32 bit e 16 bit perché sto cercando di tornare alla modalità reale dalla modalità protetta. Come un po 'di informazioni di base, il mio codice lo fa subito dopo che GRUB si avvia, quindi non ho alcun fastidioso sistema operativo che mi dica cosa posso e cosa non posso fare.

In ogni caso, uso [BITS 32] e [BITS 16] con il mio assembly per dire a naspi che tipi di operazioni dovrebbero usare, ma quando provo il mio codice usa bochs sembra che per alcune operazioni le boch non siano eseguendo il codice che ho scritto. Sembra che l'assemblatore stia inserendo extra 0x66 e 0x67 che confondono le boch.

Quindi, come posso ottenere nasm per assemblare il codice con successo dove mischio codice a 32 bit e a 16 bit nello stesso file? C'è una specie di trucco?

0

Non stavate scherzando sul fatto che questo è di basso livello!

Hai controllato gli opcode/operandi generati per assicurarti che Nasm stia rispettando correttamente le tue direttive BITS? Controlla anche che i bersagli di salto siano corretti - forse il nazismo sta usando gli offset sbagliati.

Se non è un bug in nasm, forse c'è un bug in bochs. Non riesco a immaginare che le persone tornino alla modalità a 16 bit dalla modalità a 32 bit molto spesso.


3

I codici 0x66 e 0x67 sono utilizzati per indicare che il seguente codice operativo deve essere interpretato come un bitness non predefinito. Più specificamente, (e secondo this link),

"Quando il NASM è in modalità BITS 16, le istruzioni che utilizzano dati a 32 bit sono precedute da un byte 0x66 e quelle che si riferiscono a indirizzi a 32 bit hanno un prefisso 0x67. Nella modalità BITS 32, è vero il contrario: le istruzioni a 32 bit non richiedono prefissi, mentre le istruzioni che utilizzano dati a 16 bit richiedono un 0x66 e quelle che lavorano su indirizzi a 16 bit hanno bisogno di un 0x67. "

Questo suggerisce che è colpa di Bochs.


0

Se si è in modalità reale, le dimensioni predefinite sono implicitamente 16 bit, quindi è necessario utilizzare la modalità BITS 16. In questo modo, se hai bisogno di una dimensione di operando a 32 bit, aggiungi il prefisso 0x66 e per le dimensioni di un indirizzo a 32 bit aggiungi il prefisso 0x67.

Guardate Guida Intel IA-32 di Software Developer, Volume 3, Capitolo 16 (miscelazione a 16 bit e 32-bit di codice, il numero del capitolo potrebbe cambiare secondo l'edizione del libro):

La modalità indirizzo reale, la modalità 8086 virtuale e SMM sono modalità native a 16 bit.

La direttiva BITS 32 confonderà l'assemblatore solo se lo si utilizza al di fuori della modalità protetta o della modalità lunga.


6

Il problema si è verificato che non stavo configurando correttamente le tabelle dei descrittori. Avevo girato un bit in modo errato, quindi invece di passare alla modalità a 16 bit stavo andando alla modalità a 32 bit (con segmenti che avevano un limite di un meg).

Grazie per i suggerimenti!

Terry

+1

Suggerimento: accettare la propria risposta quando ciò accade. 17 mar. 102010-03-17 21:13:07