Probleme de comprehension de jmp:(

Signaler
Messages postés
3
Date d'inscription
mercredi 9 juillet 2003
Statut
Membre
Dernière intervention
13 juillet 2003
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
yop le monde alors voila je suis debutant en asm... de temps en temps je regarde des progs en asm pour essayer de comprendre les techniques... mais voila l autre jours je suis tombé sur un drole de truc (pour mwa :D)

en fait dans le code, ebx est incrementé un certain nombre de fois et puis on fait un jmp[ebx+0x64]... je ne comprends pas tres bien ce qui se passe dans le jmp mwa je pensais qu avec un jmp on jumpais a une autre partie du prog mais la...

si vous avez une idée elle est la bien venue mercia vous tous pour l aide futur :D

MrNice

6 réponses

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
C'est le cas aussi ici c'est un jump indirect.
jmp [ebx+0x64]

effectue un saut à l'adresse qui est pointée à l'adresse ebx+0x64.
par exemple:

indirecte dd offset destination<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>
<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>...
mov ebx, offset indirecte
jmp [ebx]
...
destination:
; le jmp saute ici
...
<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>

Ca permet d'implémenter un switch (langage C) si tu connais C, C++ ou Java ou un SELECT CASE (langage BASIC), c'est à dire de faire un jump en finction d'un index dans un tableau:

Segment de données:
<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>table dd jump_pour_valeur_ebx_egal_a_0
dd jump_pour_valeur_ebx_egal_a_1
dd jump_pour_valeur_ebx_egal_a_2
dd jump_pour_valeur_ebx_egal_a_3
dd jump_pour_valeur_ebx_egal_a_4
dd jump_pour_valeur_ebx_egal_a_5
dd jump_pour_valeur_ebx_egal_a_6
dd jump_pour_valeur_ebx_egal_a_7


Segment de code:
and ebx, 7
jmp [ebx+table]
jump_pour_valeur_ebx_egal_a_0:
...
jump_pour_valeur_ebx_egal_a_1:
...
jump_pour_valeur_ebx_egal_a_2:
...
jump_pour_valeur_ebx_egal_a_3:
...
jump_pour_valeur_ebx_egal_a_4:
...
jump_pour_valeur_ebx_egal_a_5:
...
jump_pour_valeur_ebx_egal_a_6:
...
jump_pour_valeur_ebx_egal_a_7:
...


On jumpe ici en fonction de la valeur dans ebx

Core Breaker :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
C'est le cas aussi ici c'est un jump indirect.
jmp [ebx+0x64]

effectue un saut à l'adresse qui est pointée à l'adresse ebx+0x64.
par exemple:

indirecte dd offset destination

...
mov ebx, offset indirecte
jmp [ebx]
...
destination:
; le jmp saute ici
...


Ca permet d'implémenter un switch (langage C) si tu connais C, C++ ou Java ou un SELECT CASE (langage BASIC), c'est à dire de faire un jump en finction d'un index dans un tableau:

Segment de données:
table dd jump_pour_valeur_ebx_egal_a_0
dd jump_pour_valeur_ebx_egal_a_1
dd jump_pour_valeur_ebx_egal_a_2
dd jump_pour_valeur_ebx_egal_a_3
dd jump_pour_valeur_ebx_egal_a_4
dd jump_pour_valeur_ebx_egal_a_5
dd jump_pour_valeur_ebx_egal_a_6
dd jump_pour_valeur_ebx_egal_a_7


Segment de code:
and ebx, 7
jmp [ebx+table]
jump_pour_valeur_ebx_egal_a_0:
...
jump_pour_valeur_ebx_egal_a_1:
...
jump_pour_valeur_ebx_egal_a_2:
...
jump_pour_valeur_ebx_egal_a_3:
...
jump_pour_valeur_ebx_egal_a_4:
...
jump_pour_valeur_ebx_egal_a_5:
...
jump_pour_valeur_ebx_egal_a_6:
...
jump_pour_valeur_ebx_egal_a_7:
...


On jumpe ici en fonction de la valeur dans ebx

Core Breaker :)

Core Breaker :)
Messages postés
3
Date d'inscription
mercredi 9 juillet 2003
Statut
Membre
Dernière intervention
13 juillet 2003

TH CodeBreaker tres bonne explication :D
je v regarder demain matin pour mieux comprendre tout ca merci encore a twa :D
Messages postés
3
Date d'inscription
mercredi 9 juillet 2003
Statut
Membre
Dernière intervention
13 juillet 2003

Yop le monde merci pour les explicatiosn précédente Code Breaker :D

mais voila dans mon cas que penser du +0x64 dans jmp [ebx+0x64]

et dans le cas d'un jmp 0x08 que penser??? :D

merci a vous pour toute votre aide :D
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Et bien pour le +0x64 c'est la même chose que mon exemple avec table imagine juste que l'adresse de la variable
0x64.

Bref:[Coude]jmp [ebx+0x64]</td></tr></table>
ou[Coude]jmp [ebx+table]</td></tr></table>
C'est exatement le même opcode. Donc ça fait mais la même chose seule l'adresse change.

Mais
jmp 0x08

ce n'est pas le même opcode car cela équivaut à:
jmp destination
...
destination:

Donc:[Coude]jmp destination</td></tr></table>
ou[Coude]jmp 0x08</td></tr></table>
C'est exatement le même opcode.

Un opcode, ou code d'opération, c'est le code machine qui va indiquer au processeur quelle action entreprendre. L'opcode est présent en mémoire sous forme d'un octet ou d'une suite octets. Les autres octets qui constituent une instruction sont ses paramètres si elle en requiert. Le programme assembleur va transformer une instrution dans un fichier source en sa représentation binaire sous forme d'une suite d'octets. Cette suite d'octets vont ensuite se mettre dans un fichier exécutable qui pourra être chargé en mémoire lorsqu'on lance l'exécution du programme, par exemple un fichier ".exe".
Par exemple, pour le bout de code suivant:
jmp destination
...
destination:

Produit le code machine suivant:
Adresse | source assembleur | Code machine
0000h__ | jmp destination__ | EA 08 00
....
0008h__ | destination:______ |


"EA" est l'opcode de l'instruction et "08 00" sont les octets des paramètres (l'adresse de destination. Donc ici écrire dans le source assembleur l'instruction
jmp destination
ou écrire l'instruction
jmp 0x08
fait exactement la même chose.

Un jmp proche (c'est à dire dans le même segement) direct comme ici requiert une adresse d'offset de 16 bits, c'est pour cela que les paramètres sont "08 00" ce qui équivaut à l'adresse 0x0008 (sur 16 bits).

Attention nous sommes en notation dite littlz endian c'est à dire que le premier octet rencontré en mémoire est l'octet de poids faible.

Les processeur Motorola sont en big endian c'est à dire que le premier octet rencontré en mémoire est l'octet de poids fort, donc les 2 octets "08 00" en mémoire représente la valeur 16bits 0x0800.

Core Breaker :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Et bien pour le +0x64 c'est la même chose que mon exemple avec table imagine juste que l'adresse de la variable
0x64.

Bref:
jmp [ebx+0x64]

ou
jmp [ebx+table]

C'est exatement le même opcode. Donc ça fait mais la même chose seule l'adresse change.

Mais
jmp 0x08

ce n'est pas le même opcode car cela équivaut à:
jmp destination
...
destination:

Donc:
jmp destination

ou
jmp 0x08

C'est exatement le même opcode.

Un opcode, ou code d'opération, c'est le code machine qui va indiquer au processeur quelle action entreprendre. L'opcode est présent en mémoire sous forme d'un octet ou d'une suite octets. Les autres octets qui constituent une instruction sont ses paramètres si elle en requiert. Le programme assembleur va transformer une instrution dans un fichier source en sa représentation binaire sous forme d'une suite d'octets. Cette suite d'octets vont ensuite se mettre dans un fichier exécutable qui pourra être chargé en mémoire lorsqu'on lance l'exécution du programme, par exemple un fichier ".exe".
Par exemple, pour le bout de code suivant:
jmp destination
...
destination:

Produit le code machine suivant:
Adresse | source assembleur | Code machine
0000h__ | jmp destination__ | EA 08 00
....
0008h__ | destination:______ |


"EA" est l'opcode de l'instruction et "08 00" sont les octets des paramètres (l'adresse de destination. Donc ici écrire dans le source assembleur l'instruction
jmp destination
ou écrire l'instruction
jmp 0x08
fait exactement la même chose.

Un jmp proche (c'est à dire dans le même segement) direct comme ici requiert une adresse d'offset de 16 bits, c'est pour cela que les paramètres sont "08 00" ce qui équivaut à l'adresse 0x0008 (sur 16 bits).

Attention nous sommes en notation dite littlz endian c'est à dire que le premier octet rencontré en mémoire est l'octet de poids faible.

Les processeur Motorola sont en big endian c'est à dire que le premier octet rencontré en mémoire est l'octet de poids fort, donc les 2 octets "08 00" en mémoire représente la valeur 16bits 0x0800.

Core Breaker :)