2010-04-13 6 views
7

Je suis un programmeur novice qui tente d'assembler pour la première fois. Désolé d'avance si c'est une question incroyablement boiteuse.Conflit de taille d'opérande dans l'assembly x86?

J'ai un caractère stocké dans le registre EAX, mais j'ai besoin de le déplacer vers mon registre DL. Quand j'essaye: mov dl, eax j'obtiens une erreur C2443: conflit de taille d'opérande. Je sais que le registre eax est de 32 bits alors que le dl est de 8 bits ... suis-je sur quelque chose ?? Comment puis-je résoudre ce problème?

Répondre

6

Essayez

xor edx,edx 
mov dl, al 

peut-être? La première instruction pour mettre à zéro les bits d'ordre élevé 'non-nécessaires' d'edx (optionnel), puis déplacez le low 8 de eax vers edx.

Comme d'autres l'ont souligné, movzx le fait en une seule étape. Dans le même ordre d'idée, si vous aviez une valeur signée dans al, vous pourriez utiliser "movsx edx, al" pour remplir les bits de poids fort d'edx avec une copie du msb de al, mettant ainsi un signe Représentation de 32 bits d'al dans edx.

+0

C'est exact. Le registre EAX a une largeur de 32 bits, alors que DL n'est que de 8 bits. Vous devez déplacer AL à DL, AL étant un sous-ensemble de EAX. – MPelletier

+0

Et xoring edx est juste une bonne idée :) Belle et propre. – MPelletier

+0

Je ne comprends pas la première instruction. Est-ce que 'xor edx, edx' n'annulera pas * tous * les bits de% edx? –

3

Si vous voulez juste pour accéder aux 8 bits inférieurs de eax, puis utilisez al:

mov dl, al 

Vous pouvez accéder à la partie inférieure de 8 bits, 16 bits ou 32 bits de chaque registre à usage général en changeant la lettres au début ou à la fin. Pour le registre eax, utiliser eax signifie utiliser tous les 32 bits, ax est le 16 bits inférieur, et al est le 8 bits inférieur. L'équivalent pour ebx est respectivement ebx, bx et bl, et ainsi de suite.

Notez que si vous modifiez les 16 ou 8 bits inférieurs d'un registre, les bits supérieurs restent inchangés. Par exemple, si vous chargez tous les uns dans eax, alors chargez zéro dans al, alors les 8 bits les plus bas de eax seront des zéros, et les 24 bits les plus hauts seront les uns.

mov eax, -1 ; eax is all ones 
mov al, 0 ; higher 24 bits are ones, lower 8 bits are zeros 
+0

Déplacer al dans dl est le cas de base. Zéro-remplissage ou signe-extension peut ou ne pas être nécessaire parce que lorsque vous choisissez l'assemblage codé à la main, vous êtes - ou devriez être - après la solution minimale, bare-bones: "nice to have" est un luxe coûteux et naturellement exclu. –

11

Ce que vous voulez est probablement:

movzx edx, al 

Cela copiera al à dl et zéro remplir le reste de EDX. Cette instruction unique est équivalente à ces deux instructions:

xor edx, edx 
mov dl, al 
+3

Je préfère ça. movzx s'occupe de tous les bits de queue. Yay pour une certaine abstraction! (Mon enthousiasme devrait trahir mon manque d'expérience avec l'assemblée). – MPelletier