Probleme de comprehension de jmp:(

SVKMrNice Messages postés 3 Date d'inscription mercredi 9 juillet 2003 Statut Membre Dernière intervention 13 juillet 2003 - 9 juil. 2003 à 23:43
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 13 juil. 2003 à 22:44
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

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
10 juil. 2003 à 21:01
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 :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
10 juil. 2003 à 21:04
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 :)
0
SVKMrNice Messages postés 3 Date d'inscription mercredi 9 juillet 2003 Statut Membre Dernière intervention 13 juillet 2003
10 juil. 2003 à 23:38
TH CodeBreaker tres bonne explication :D
je v regarder demain matin pour mieux comprendre tout ca merci encore a twa :D
0
SVKMrNice Messages postés 3 Date d'inscription mercredi 9 juillet 2003 Statut Membre Dernière intervention 13 juillet 2003
13 juil. 2003 à 18:05
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
13 juil. 2003 à 22:42
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 :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
13 juil. 2003 à 22:44
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 :)
0