J'essaie de faire un saut relatif dans l'assemblage x86, mais je n'arrive pas à le faire fonctionner. Il semble que pour une raison quelconque, mon saut ne cesse de se réécrire comme un saut absolu ou quelque chose comme ça.GCC/X86, Problèmes avec les sauts relatifs
Un exemple de programme simple pour ce que je suis en train de faire est la suivante:
.global main
main:
jmp 0x4
ret
Depuis l'instruction jmp est de 4 octets et un saut relatif est décalé par rapport à l'adresse du saut + 1, cette devrait être un no-op de fantaisie. Cependant, compiler et exécuter ce code provoquera une erreur de segmentation. Le vrai casse-tête est de le compiler au niveau de l'objet puis de désassembler le fichier objet. Il semble que l'assembleur fasse un saut relatif, mais après que le fichier soit compilé, le lieur le change en un autre. type de saut.
Par exemple, si le code ci-dessus était dans un fichier appelé asmtest.s:
$gcc -c asmtest.s
$objdump -D asmtest.o
... Some info from objdump
00000000 <main>:
0: e9 00 00 00 00 jmp 5 <main+0x5>
5: c3 ret
Cela ressemble à l'assembleur fait correctement un saut relatif, bien qu'il soit suspect que l'instruction jmp est rempli de 0s.
J'ai ensuite utilisé gcc pour relier ensuite démontées et obtenu ceci:
$gcc -o asmtest asmtest.o
$objdump -d asmtest
...Extra info and other disassembled functions
08048394 <main>:
8048394: e9 6b 7c fb f7 jmp 4 <_init-0x8048274>
8048399: c3 ret
Ce me ressemble l'éditeur de liens réécrit l'instruction jmp ou substitué 5 dans une autre adresse.
Donc, ma question se résume à, qu'est-ce que je fais mal? Est-ce que je ne spécifie pas le décalage correctement?
Suis-je en train de mal comprendre comment fonctionnent les sauts relatifs? Est-ce que gcc essaie de m'assurer que je ne fais pas de choses dangereuses dans mon code?
Saut à une étiquette nommée comment les sauts sont normalement effectués dans l'assemblage. C'est très basique. Je suppose que l'OP le sait déjà et souhaite vraiment coder à la main un saut relatif pour une raison quelconque. –
Je suppose que ce commentaire était en réponse à la mienne. Je l'ai supprimé car j'ai déplacé mon commentaire à une réponse à la place. –
Merci pour l'aide, cela fonctionne exactement comme j'en ai besoin aussi. Merci aussi de m'avoir signalé le problème en sautant trop loin, je ne savais pas exactement d'où l'instruction était calculée. –