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:
ou
C'est exatement le même opcode. Donc ça fait mais la même chose seule l'adresse change.
Mais
ce n'est pas le même opcode car cela équivaut à:
jmp destination ... destination:
|
Donc:
ou
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
ou écrire l'instruction
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 