Vous devriez lire les manuels Intel, il explique comment faire cela. Pour une référence plus simple, read this. La façon dont les instructions x86 sont codées est assez simple, mais le nombre de possibilités peut être un peu écrasant.
En un mot, une instruction x86 comprend les pièces suivantes, où toutes les parties, sauf l'opcode peut être manquant:
prefix opcode operands immediate
Le champ prefix
peut modifier le comportement de l'instruction, qui ne s'applique pas votre cas d'utilisation. Vous pouvez rechercher le opcode
dans une référence (J'aime this one), par exemple, mov r/m32, imm32
est C7 /0
ce qui signifie: L'opcode est C7
et l'un des deux opérandes est zéro comme opérande étendu. Cette instruction nécessite 32 bits immédiate, de sorte que l'instruction a la forme
C7 operand/0 imm32
L'opérande/opcode étendu est codé sous la forme d'un octet MODR/m avec un octet sib en option (base de l'indice d'échelle) pour des modes d'adressage et un déplacement optionnel de 8 ou 32 bits. Vous pouvez rechercher quelle valeur vous avez besoin in the reference. Donc, dans votre cas, vous voulez coder un opérande de mémoire [rbp]
avec un déplacement d'un octet et un opérande de registre de 0, conduisant à l'octet modr/m 45
. Donc, le codage est:
C7 45 disp8 imm32
Maintenant, nous codons le déplacement de 8 bits dans le complément à deux. -4
correspond à FC
, donc c'est
C7 45 FC imm32
Enfin, nous chiffrons l'immédiat, 32 bits que vous voulez être 2
. Notez qu'il est en petit boutiste:
C7 45 FC 02 00 00 00
Et c'est ainsi que l'instruction est codée.
Que voulez-vous dire par «convertir»? En utilisant un programme? Le faire manuellement? – Shiro
Conversion manuelle. –
'int b = 2;' n'est PAS un langage d'assemblage.La différence est que C est un langage compilé, donc la ligne 'int b = 2;' peut être implémentée de différentes façons (même complètement supprimée par l'optimiseur), selon ce que le compilateur décidera, comment produire un code machine qui produira résultats tels que définis par la norme de langage C. Le langage d'assemblage est différent d'une certaine façon, Assembler n'est pas un compilateur de ce genre, quand vous écrivez dans Assembly 'add rax, rbx', il sera compilé comme ça, ne changeant pas l'instruction, ou enlevant par un optimiseur, c'est plus comme "transformation 1: 1". – Ped7g