6
votes

ASM 80x86 16 bits: Lea CX, [CX * 8 + CX] provoque une erreur sur NASM (compilation de fichier .com)

L'erreur NASM donne (malgré mon système d'exploitation) est "Adresse effective invalide".

Maintenant, j'ai vu de nombreux exemples de comment utiliser Lea et je pense que je l'ai bien compris, mais mon Nasme n'aime pas ça. J'ai essayé Lea CX, [CX + 9] et cela a fonctionné; Lea CX, [BX + CX] N'A PAS.

Maintenant si j'ai étendu mes registres à 32 bits (c.-à-d. Lea ECX, [ECX * 8 + ECX] ) Tout serait bien mais je suis limité pour utiliser des registres 16 et 8 bits seulement.

est là que quelqu'un est si bien informé qui pourrait m'expliquer pourquoi mon assembleur ne me laisse pas utiliser lea comme je suis supposé que cela devrait être utilisé?


1 commentaires

Je pense que vous vous trompez lorsque vous dites que lea CX, [CX + 9] a travaillé.


3 Réponses :


9
votes

Ceci est parce que [bx + cx] n'est pas valide dans un mode d'adressage sur 16 bits x86, voir cette site pour plus d'informations.

Lea CX, [bx + di] ou Lea CX, [BX + Si] devrait fonctionner.

Si votre code fonctionnera en mode 386 ou ultérieure en mode 16BIT, vous pouvez utiliser Lea Lea CX, [ECX + 9] (préfixe de taille d'adresse mais encore 16 bits d'opérande).

Voir aussi Ce Q & A sur X86 Adressage des modes (surtout en discutant des modes d'adressage 32/64 bits et le tag wiki.


0 commentaires

6
votes

LEA CX, [CX * 8 + CX] Ne fonctionne pas car "Balance-Index-Base" est uniquement disponible avec des registres 32 bits. Ce n'est pas une limitation de l'assembleur - c'est une limitation du processeur.


0 commentaires

3
votes

Ces tableaux suivants pour construire un postbyte indifférent que le registre peut être utilisé comme un enregistrement d'adresse et lequel d'entre eux peut être combiné avec un second registre d'adresses (Baseregister + IndexGister et peut-être la mise à l'échelle) pour construire une adresse avec elle. (Observé à partir du mode d'adresse 16 bits, où le drapeau D n'est pas défini.) XXX

Dirk


0 commentaires