A scuola abbiamo utilizzato un programma di bootstrap per eseguire programmi stand-alone senza un sistema operativo. Ho studiato questo programma e quando la modalità protetta è abilitata c'è un salto in avanti eseguito assemblando direttamente l'opcode e gli operandi come dati all'interno del programma. Questo è stato per l'assemblatore GNU:Qualcuno può spiegare questo opcode JMP x86 assemblato direttamente?
/* this code immediately follows the setting of the PE flag in CR0 */
.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
Prima di tutto, perché uno vuole fare questo (al posto del mnemonico istruzioni)?
Ho dato un'occhiata ai manuali Intel, ma sono ancora un po 'confuso dal codice. Specificamente nel Volume 2A, pagina 3-549, c'è una tabella di codici operativi. La voce in questione:
EA *cp* JMP ptr16:32 Inv. Valid Jump far, absolute, address given in operand
Il codice operativo attuale è ovvio, ma il primo byte, 0x66, mi ha confuso. Riferendosi alla tabella del manuale Intel, il cp apparentemente significa che seguirà un operando da 6 byte. E ovviamente 6 byte seguono nelle prossime due righe. 0x66 codifica un prefisso di override della dimensione dell'operando. Cosa c'entra questo con il cp nella tabella? Mi aspettavo che ci fosse qualche valore esadecimale per il cp, ma invece c'è questo prefisso override. Qualcuno può chiarire questo per me?
Ecco una discarica da od:
c022 **ea66 0000 0001 0010** ba52 03f2 c030
TARGET_ADDRESS è stata definita come 0x00010000.
Sono anche un po 'confuso dal significato degli ultimi due byte. Tuttavia, questa sembra essere un'altra domanda. Sta diventando piuttosto tardi, e ho guardato il codice e i manuali Intel per ore, quindi spero di aver capito il punto.
Grazie per la ricerca!
Le persone utilizzano opcodes (invece di istruzioni) per 2 motivi.La prima ragione è quando l'assemblatore è "meno che adeguato" e non fornisce supporto per le istruzioni di cui hanno bisogno (questo è/era comune quando vengono aggiunte nuove istruzioni e gli assemblatori più anziani non le supportano ancora). La seconda ragione è quando l'assemblatore supporta le istruzioni di cui hanno bisogno ma il programmatore non sa come convincere l'assemblatore a generarlo. Fondamentalmente, si tratta di cattivi strumenti (compresi vecchi strumenti, sintassi confusa e/o cattiva documentazione) o programmatori cattivi. – Brendan
Nota: il mio commento sopra è "in generale" e si applica a tutti gli assemblatori. Non uso GAS e non ho idea se supporti l'istruzione "salto lontano a 32 bit nel codice a 16 bit" o meno (o quanto sia buona/cattiva la documentazione). – Brendan