2017-06-15 1 views
1

Je suis confondu avec l'aide de l'opérateur PTR avec instruction movQuand j'utilise un opérateur PTR avec des opérandes indirects dans MASM?

Dans mon livre,

.data 
byteVal BYTE 10h 
.code 
mov esi, OFFSET, byteVal 
mov al, [esi] 

ce code est valide

mais

Employee STRUCT 
    IDNum BYTE "000000000" 
    Years WORD 0 
Employee ENDS 

.data 
worker Employee <> 
.code 
mov esi, OFFSET worker 
mov ax, [esi].Years 

ce code est invalide

mais

mov ax, (Employee PTR [esi]).Years 

ce code est valide

Je veux savoir quand j'utilise l'opérateur PTR avec instruction mov et opérande indirecte

+0

Vous devez utiliser PTR pour lancer quelque chose à un type différent. '[esi]' n'a pas de type, donc vous devez lancer quelque chose d'autre à moins que le type puisse être déduit de l'autre opérande. –

Répondre

0

Vous devez dire à l'assembleur précisément ce que esi struct pointe vers ... ce s'il y avait plusieurs structures avec des éléments du même nom (dans ce cas .Années)?

Vous pouvez accomplir une chose semblable en mettant PRÉSUMER en vigueur:

assume esi:ptr Employee 

Puis, quand esi ne détient plus ptr employé valide:

assume esi:nothing 
+0

Merci pour votre réponse! J'ai une autre question. Pourquoi est-ce possible quand j'utilise "mov al, [esi]" dans le premier bloc de code? – uninopkn

+3

"mov al, [esi]" n'implique pas un membre de structure - c'est simplement un opcode pour charger l'octet de [esi] dans al. Lorsque vous utilisez [esi] .Années, l'assembleur doit connaître le décalage des années à coder dans l'instruction. Il pourrait y avoir 10 structures avec des membres "Ans"; l'assembleur doit être explicitement dit à quel type esi pointe. –