2015-04-03 36 views
1

我目前正在通過Kip R. Irvine的x86處理器彙編語言第6版。這很令人愉快,但有些事情讓我感到困惑。在x86程序集的數組中使用OFFSET運算符?

早在書中,下面的代碼所示:

list BYTE 10,20,30,40 
ListSize = ($ - list) 

這對我有意義。在聲明一個數組之後,用數組的起始位置減去內存中的當前位置以獲取數組使用的字節數。

然而,這本書後來做:

.data 
arrayB BYTE 10h,20h,30h 
.code 
mov esi, OFFSET arrayB 
mov al,[esi] 
inc esi 
mov al,[esi] 
inc esi 
mov al,[esi] 

據我瞭解,OFFSET相對於程序的段返回變量的位置。該地址存儲在esi寄存器中。立即用於訪問esi中表示的地址處存儲的值。遞增將地址移動到下一個byte

那麼在數組上使用OFFSET和簡單地調用數組變量有什麼區別?之前我曾經相信,簡單地調用數組變量也會給我它的地址。

+2

根據您的彙編程序的語法,使用數組名稱會從內存中加載的第一要素,沒有地址。 – Jester 2015-04-03 18:19:58

回答

1
.data 
Number dd 3 
.code 
mov eax,Number 
mov ebx,offset Number 

EAX將在一定的地址讀存儲器和存儲的號碼3

EBX將存儲的某些地址。

mov ebx,offset Number 

在這種情況下相當於

lea ebx,Number 
+1

同樣,這是彙編程序特定的。 OP應該真的參考他的彙編文檔。例如,我使用的大多數將在第一個示例中將地址移動到EAX中。移動內容需要括號或大括號。 – 2015-04-03 19:45:51