2009-11-06 6 views
4

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" 
    ); 
} 
+0

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? –

+0

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 :-) –

Répondre

2

Il semblerait ljmp nécessite des constantes de travail, alors que cela génère plus de code et est évidemment pas particulièrement sûr, cela semble fonctionner comme quand j'entre une valeur qui n'est pas la valeur actuelle cs, l'application se bloque. Il utilise plutôt une valeur immédiate:

#define set_cs(cs) asm volatile ("ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs))

Il est pas aussi élégant que je suppose que vous vouliez que ce soit, et dépend entièrement de ce que vous essayez de faire. Je ne peux pas imaginer que cela soit utile ou même fonctionnel si vous compilez ceci sous Linux/Windows.

+2

Les sauts lointains sont utilisés dans le code autonome (par exemple le code du système d'exploitation) pour spécifier les sélecteurs de segment de code (même dans x86_64 ils sont utilisés pour spécifier le niveau de privilège, c.-à-d. Je suis d'accord, cela n'a pas beaucoup de sens dans le code de l'espace utilisateur ... – vyudh

Questions connexes