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?
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:
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
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, ...