web-dev-qa-db-fra.com

Comment fonctionne l'instruction MOVSX Assembly?

Comment l'instruction Assembly MOVSX fonctionne-t-elle dans l'exemple suivant:

MOVSX ECX,BYTE PTR DS:[EDX]

Dans ce cas, voici l'état des registres:

ECX = 0000000F   
EDX = 0012FD9F 

D'après ce que je pensais, il faut les derniers octets de [EDX] = 9F, le déplace vers ECX puis le signe l'étend pour qu'il corresponde à 16 bits = 0000009F. Cependant, le résultat réel est 00000016. Quelqu'un peut-il m'aider à expliquer où je me trompe?

7
Abundance

C'est partiellement correct. Toutefois:

BYTE PTR DS:[EDX] obtient l'octet situé à l'adresse contenue dans EDX . Cet octet est copié dans ECX dans l'octet le moins significatif et le reste est rempli du signe de l'octet.

Pour votre résultat inattendu, cela signifie qu’à l’adresse mémoire1 0x12FD9F l'octet 0x16 est situé.


Remarques:

  • le préfixe de substitution de segment DS: n'est pas nécessaire ici. [EDX] fait automatiquement référence à DS.

1 "adresse mémoire" se réfère ici à la mémoire virtuelle ou physique

8
cadaniluk

De nombreuses instructions Intel/AMD x86 sont disponibles au format "modrm" - elles ont deux opérandes dont l’un doit être un registre, l’autre pouvant être un registre ou une référence mémoire dont l’adresse est déterminée par l’octet de modrm de le codage d'instruction, et éventuellement par les octets suivants de l'instruction, tels que le sib (octet d'index mis à l'échelle) et l'offset immédiat constant/mémoire. Et aussi par un octet de préfixe de segment possible.

Ce sont généralement des instructions reg, reg/mem, de la forme

   rsrcdst += rsrc
or
   rsrcdst += Memory[ ... addressessing mode ...]

Mais le code d'assemblage x86 n'a pas de code opération/code mnémonique séparé pour les formes reg, reg et reg, mem de ces instructions. Qu'un opérande soit un registre ou un emplacement mémoire est indiqué, dans l'assembleur, par la syntaxe Assembly.

Dans ce cas, votre code d'assemblage est

MOVSX ECX, BYTE PTR DS: [EDX]

L'opcode d'instruction est MOVSX.

L'opérande de destination est register ECX.

L'opérande source est "BYTE PTR DS: [EDX]". Plusieurs éléments indiquent qu’il s’agit d’une référence mémoire: (1) les crochets autour de "[EDX]" - ils représentent un raccourci pour Memory [... address ...]. (2) le préfixe "DS:", qui indique qu'il se trouve dans le segment de données. Les opérandes de registre n'ont pas un tel préfixe de segment. (3) le "BYTE PTR" - qui dit "prend l'adresse de mémoire spécifiée par 'DS: [EDX]', et l'interprète comme faisant référence à un octet de 8 bits en mémoire".

Je soupçonne que ce que tu veux vraiment, c'est

MOVSX ECX,DL

"DL" est un nom pour les 8 bits inférieurs du registre EDX à 32 bits. C'est à dire. DL = EDX.bits [7: 0]. Malheureusement, les assembleurs x86 n’acceptent généralement pas la syntaxe du type "EDX.bits [7: 0]" (sauf si je les ai écrits), vous devez donc connaître les noms historiques des sous-registres:

AL = EAX.bits[7:0]
AH = EAX.bits[15:8]
AX = EAX.bits[15:0]
EAX = 32 bit register that "covers" all of the above

et ainsi de suite: BL, CL, DL, DI, ...

3
Krazy Glew