Je pensais utiliser un saut lointain pour définir le registre de segment de code (CS). Comprendre pourquoi je fais cela et pourquoi je suis confronté à la segmentation prendrait du temps, alors supportez-moi et considérez cela comme un exercice académique. Je n'arrive pas à avoir la syntaxe correcte.Syntaxe ljmp dans l'assemblage en ligne gcc
Error: suffix or operands invalid for 'ljmp'
Je sais qu'il est stupide de mettre cs
dans un autre registre, mais je pensais que je l'essayer puisque l'utilisation %0
ne fonctionnait pas (le registre ax
ne fonctionne pas non plus).
Je suis à la recherche à un code qui compile bien et cela me rend fou, car je pensais que ljmp
serait le même: __asm volatile ("lcall $0x8, $far_call");
je serais de bienvenue bien sûr d'autres façons aki d'affecter le registre 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"
);
}
L'assemblage en ligne est une douleur dans le cul; pourquoi ne pas simplement écrire de vraies routines d'assemblage dans de vrais fichiers d'assemblage? –
Etes-vous sûr qu'il est encodable avec des registres au lieu d'immédiatement en lisant le manuel d'Intel? Je ne peux toujours pas décoder cette chose :-) –