2017-06-15 5 views
1

Ich bin verwirrt mit PTR-Operator mit mov Anweisung verwendetWenn ich PTR-Operator mit indirekten Operanden in MASM verwende?

In meinem Buch

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

dieser Code ist gültig

aber

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

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

dieser Code ungültig ist

aber

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

dieser Code ist gültig

Ich möchte wissen, wenn ich PTR-Operator mit mov Anweisung und indirekten Operanden verwenden

+0

Sie müssen PTR nutzen, um etwas zu werfen ein anderer Typ. '[esi]' hat keinen Typ, daher müssen Sie in etwas anderes umwandeln, es sei denn, der Typ kann aus dem anderen Operanden abgeleitet werden. –

Antwort

0

Sie müssen genau den Assembler sagen, welche Struktur esi zeigt auf ... was wenn es mehrere Strukturen mit gleichnamigen Elementen (in diesem Fall .Jahre) gäbe?

Sie können eine ähnliche Sache erreichen, indem ein in Kraft NEHMEN setzen:

assume esi:ptr Employee 

Dann, wenn esi gilt nicht mehr einen gültigen Mitarbeiter ptr:

assume esi:nothing 
+0

Vielen Dank für die klare Antwort! Ich habe noch eine Frage. Warum ist es möglich, wenn ich im ersten Codeblock "mov al, [esi]" verwende? – uninopkn

+3

"mov al, [esi]" enthält kein Strukturelement - es ist einfach ein Opcode, um das Byte bei [esi] in al zu laden. Wenn Sie [esi] .Years verwenden, muss der Assembler den Offset von Years kennen, um in den Befehl zu codieren. Dort könnten _ 10 Strukturen mit "Jahren" Mitgliedern sein; Der Assembler muss explizit angegeben werden, auf welchen Typ esi zeigt. –