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"
    );
}
È stato utile?

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.

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