2011-11-17 2 views
1

I a créé une structure qui a tenu des informations de base, ainsi que des chaînes de BYTE .. Par exemple:Assemblée Langue x86: Décalage d'un opérande indirect à une structure

EXAMPLESTRUCT STRUCT 
somePrompt BYTE 20 DUP (0) 
;other fields 
EXAMPLESTRUCT ENDS 

Mon intention était de créer un tableau de structures avec des messages relatifs à cette structure spécifique, initialisation le long des lignes de:

ex1 EXAMPLESTRUCT <"Enter first"> 
ex2 EXAMPLESTRUCT <"Enter second"> 

référençant l'adresse du champ de structure directement (mov edx, OFFSET ex1.somePrompt) a bien fonctionné, mais l'utilisation de l'adressage indirect je continué à obtenir un Erreur OFFSET:Donc, est-ce que mon code est faux ou est-ce juste une utilisation illégale de OFFSET pour une raison ou une autre?

Le seul travail que j'ai trouvé autour faisait la structure contient des pointeurs, puis les initialiser à pointer un message déjà:

WORKAROUND STRUCT 
somePTR DWORD ? 
;... 
WORKAROUND ENDS 

.data 
msg BYTE "Hello World",0 
struct1 WORKAROUND <OFFSET msg> 

puis affiche un message le long des lignes de

mov esi,OFFSET struct1 
mod edx,(WORKAROUND PTR [esi]).somePTR 

D'autres solutions/solutions de contournement ou devrais-je m'en tenir aux pointeurs?

Répondre

1

Vous souhaitez utiliser l'instruction lea.

lea edx,(EXAMPLESTRUCT PTR [esi]).somePrompt 

Voir What's the purpose of the LEA instruction? un peu plus sur lea.

OFFSET est une construction à la compilation. Lorsque vous utilisez la directive OFFSET, l'assembleur doit être en mesure de le résoudre à une valeur lors de la compilation. C'est pourquoi vous receviez une erreur - parce que l'assembleur ne peut pas savoir quelle sera la valeur de esi.

+0

Instruction très utile, merci beaucoup qui a fait l'affaire. – user994121

Questions connexes