Question

Je pensais à l'aide d'un saut loin pour définir le segment de code (CS) registre. Obtenir des raisons pour lesquelles je fais cela et pourquoi je fais face à la segmentation serait du tout prendre un certain temps, donc garder avec moi et le considèrent comme un exercice académique. Je ne peux pas sembler obtenir le droit de syntaxe.

Error: suffix or operands invalid for 'ljmp'

Je sais qu'il est stupide de mettre cs dans un autre registre, mais je pensais que ce que je vais essayer puisque l'utilisation %0 ne fonctionnait pas (le registre de 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 voudrais bien sûr accueillir d'autres moyens 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"
    );
}
Était-ce utile?

La solution

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 ce jamais être utile ou travailler même si vous compilez cela fonctionne sous linux / windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top