2017-06-15 13 views
1

我很困惑使用PTR運營商,MOV指令當我在MASM中使用間接操作數的PTR操作符?

在我的書中,

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

這個代碼是有效的

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

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

這個代碼是無效

但是

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

這個代碼是有效的

我想知道當我使用PTR運算符MOV指令和間接操作數

+0

您需要使用PTR投東西

您可以通過將有效的承擔完成了類似的事情一個不同的類型。 '[esi]'沒有類型,因此除非可以從其他操作數推斷出類型,否則您需要將其轉換爲其他類型。 –

回答

0

你需要告訴彙編正是結構ESI指向什麼?如果有多個具有相同名稱的元素的結構(在這種情況下是。年)?

assume esi:ptr Employee 

然後當ESI不再持有有效的僱員PTR:

assume esi:nothing 
+0

謝謝你明確的答案!我還有一個問題。爲什麼當我在第一個代碼塊中使用「mov al,[esi]」時可能? – uninopkn

+3

「mov al,[esi]」不涉及結構成員 - 它只是將[esi]中的字節加載到al中的操作碼。當你使用[esi]。年,彙編器需要知道要編碼到指令中的年的偏移量。有「年」成員的可以是10個結構;彙編程序需要明確告知哪些類型的esi指向。 –