sintassi LJMP in assembly inline gcc
-
18-09-2019 - |
Domanda
Stavo pensando di utilizzare un salto lontano per impostare il segmento di codice (CS) registrati. Entrare in questo che sto facendo questo e il motivo per cui ho a che fare con la segmentazione del tutto avrebbe preso un po ', in modo da portare con me e lo considerano un esercizio accademico. Io non riesco a ottenere la giusta sintassi.
Error: suffix or operands invalid for 'ljmp'
Lo so che è sciocco mettere cs
in un altro registro, ma ho pensato che mi piacerebbe provare da quando usando %0
non funzionava (il registro ax
non funziona neanche).
sto guardando un po 'di codice che compila bene e questo mi sta facendo impazzire, perché ho pensato ljmp
sarebbe la stessa: __asm volatile ( "lcall $0x8, $far_call" );
Vorrei ovviamente accogliere altri modi hacky di influenzare registro CS.
void set_cs(u16 cs) {
__asm__ volatile (
"mov %0, %%ax \n\t"
"ljmp %%ax, $fake_label \n\t"
"fake_label: \n\t"
:
: "r" (cs)
: "ax"
);
}
Soluzione
Sembrerebbe LJMP richiede costanti al lavoro, mentre questo genera più codice e ovviamente non è particolarmente sicuro, questo sembra funzionare come quando entro un valore che non è il valore corrente cs, l'applicazione si blocca. Si avvale di un valore immediato, invece:
#define set_cs( cs ) asm volatile ( "ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs) )
Non è elegante come presumo si voleva che fosse, e dipende interamente da ciò che si sta cercando di fare. Non riesco a immaginare questo mai essere utile o anche di lavoro se si sta compilando questo da funzionare in Linux / Windows.