2010-01-25 13 views
2

En assemblage x86, comment effectuer un saut inconditionnel d'une section à une autre?Assemblage: Passer d'une section à l'autre

Par exemple:

.section .text 
main: ... 
     jmp here 
     ... 

.section .another 
here: ... 

Je suppose que cela est un saut loin. Je reçois une erreur de segmentation en essayant de lancer ceci. Une solution de contournement?

+3

Quel assembleur? –

+0

Oups! J'utilise GAS. – TripShock

Répondre

1

Comme vous ne l'avez pas spécifié quel type assembleur (MSNA gaz, masm, TASM)

Si tu sais ce segment est la partie here est, par exemple, si la partie .section est dans le segment de code 0x8, alors vous pouvez le faire:

 
jmp 0x8:here 

vous pouvez définir la constante de préciser le segment et l'utilisation qui a également ... à nouveau votre kilométrage varie en fonction de l'assembleur ..

Hope this helps, Be salutations, Tom.

+1

Aussi, voir ici pour une autre façon de le faire, pousser le segment sur la pile, pousser l'adresse de l'étiquette sur la pile et émettre un retour loin comme indiqué http://stackoverflow.com/questions/1398034/inline-assembly -jump-error – t0mm13b

+2

Cependant, gardez à l'esprit que l'émission d'un retour sans appel correspondant va probablement gâcher la pile interne dans le prédicteur de branche, qui tourne avec la performance d'appel de fonction. Vous devriez utiliser un retour éloigné pour revenir d'un appel éloigné, et un saut lointain sinon. –

+0

Comment faites-vous un saut lointain dans le GAS? – TripShock