Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : probleme de comprehension de jmp:( [ Archives / Newbii ] (SVKMrNice)

mercredi 9 juillet 2003 à 23:43:15 | probleme de comprehension de jmp:(

SVKMrNice

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

jeudi 10 juillet 2003 à 21:01:51 | Re : probleme de comprehension de jmp:(

CoreBreaker

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


jeudi 10 juillet 2003 à 21:04:47 | Re : probleme de comprehension de jmp:(

CoreBreaker

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


jeudi 10 juillet 2003 à 23:38:46 | Re : probleme de comprehension de jmp:(

SVKMrNice


TH CodeBreaker tres bonne explication :D
je v regarder demain matin pour mieux comprendre tout ca merci encore a twa :D


-------------------------------
Réponse au message :
-------------------------------

> 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
>
>

dimanche 13 juillet 2003 à 18:05:12 | Re : probleme de comprehension de jmp:(

SVKMrNice

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


dimanche 13 juillet 2003 à 22:42:23 | Re : probleme de comprehension de jmp:(

CoreBreaker

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]

ou[Coude]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:[Coude]jmp destination

ou[Coude]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

dimanche 13 juillet 2003 à 22:44:49 | Re : probleme de comprehension de jmp:(

CoreBreaker

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



Cette discussion est classé dans : probleme, temps, asm, comprehension, jmp


Répondre à ce message

Sujets en rapport avec ce message

probleme en asm [ par chatinena ] bonjour,je suis en premiere année (graduat en informatique) et je dois remettre un projet en asm qui s'appelle "La Belle Calculette" seulement je n'y compilateur Multi-OS [ par frobinet ] Bonjour,Je redéveloppe actuellement en Assembleur 32 (MASM32) la plupart de mes logiciels écrit initialement en Visual Basic (pour des problèmes de ra probleme avec repne scasb [ par cbil ] débutant en c/c++, flash et asm- Me contacter(programmation en ASM model small avec TASM)Un petit soucit avec repne et scasb, ex :cld mov di, offset l [NEWBIE] Petit Probleme ! Aidez moi ! [ par xaminou ] Voila , jaimerai cree une fonction qui calcule la suite suivante :Xn+1=Xn + (Xn2 or 5) qui prend en paramètre (dans la pile) l'adresse d'un nombre Xn Projet en ARM: BESOIN D AIDE! [ par aurore7683 ] Bonjour, les gens!Je sollicite l aide de quelques passionnés de programmation en assembleur. Je m'explique: je dois faire un projet d informatique ( q Sous-procedure externe en Assembleur ? [ par cbil ] débutant en c/c++, flash et asm- Me contacterBonjour à tous,J'utilise TASM et j'aimerais faire une sous procedure externe.J'ai tester un exemple, (je Prog asm se lit haut en bas ou l'inverse? [ par xtrema33 ] Salut J'ai une question qui peut paraitre bete mais voila. Le programme assembleur se lit de bas en haut ou de haut en bas? A mon avis c'est de bas en Code HUFFMAN en asm 68000 [ par arnaud gasnier ] salut,je voulais savoir si qqun pouvait m'aider pour trouver comment coder en ASM 68000 l'algo de huffman pour compresser un petit texte. le tout débu convertir asm en c [ par skills ] Bonjour,Je dispose d'un fichier assembleur et je voudrais le convertir en C.Ceci est pour un pic 16f876.Merci d'avance@+ W32Dasm et code ASM [ par bundyboss ] Salut a vous tous!!Presque tout est dans le titre..En fait j'aimerai savoir si le code ASM que ressort W32Dasm ou autre programme du genre et directem


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,515 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.