2017-02-05 30 views
0

讓我們這樣的代碼:存儲在寄存器中的值,是當它涉及當純價值

mov eax, [esp] ; value of what inside esp 
add esp, 4  ; memory or effective address 

,你可以在默認情況下 - 無[] - 我們在組件存儲器工作。但是,爲什麼如果我想將123存儲在註冊表中,我不必使用[]?

mov eax, 123 ; is 123 a memory address? or pure value? 

因此,123這裏如何處理:作爲一個值或地址?這是一個價值,但爲什麼不解決?基於前面的例子,它必須是一個地址。還是取決於註冊?

回答

1

mov eax,[esp]

不中esp的內容移動到EAX。
相反,它將存儲在esp中的數字解釋爲一個地址,並使用該地址獲取內存的內容;那麼它將返回存儲在該內存地址的任何內容。

圖形:

esp [0x760001] 

memory 
      1 2 3 4 5 6 7 8 ...... 
760000 AA BB CC DD FF FF FF FF ..... 
770000 11 22 33 44 ....... 
780000 ................ 

在內存地址0x7600010x760004我們存儲的值DDCCBBAA(4個字節)。 在內存地址0x7600050x760008我們已經存儲了值FFFFFFFF(4字節)。

每當我們使用[...]我們都在談論指針。指針是一個數字,表示內存中的位置(又名地址)。
如果我們執行mov eax,[esp]我們不關心esp的數值,但關於esp指向的內存。
如果我們執行mov eax,esp,我們將esp中的字面值加載到eax中。

如果我們這樣做,我們mov eax,123只需填寫eax用文字數123

CPU不會在意在寄存器的數量是否是字面號碼或地址。它會愉快地進行計算,畢竟地址只是另一個數字。

但是,當我們使用[q]時,我們告訴CPU去查找內存位置[q]
如果我們不使用[],我們只是簡單地使用存儲在寄存器中的數字。
我們可能以後再次使用這個數字作爲指針。

一個例外
例外是lea指令(例如lea eax,[eax+4]:EAX = EAX + 4)。該指令沒有在內存中查找任何內容,它使用數字(可能是也可能不是地址)進行計算。

它取決於寄存器嗎?

不,所有的寄存器可以用作雙重目的寄存器(無論對於計算和作爲指針)。
唯一的例外是指向堆棧的esp。 CPU允許你對它進行計算,但是如果中斷髮生時它的程序不包含有效地址,程序會崩潰。

但是,爲什麼要將123存儲在寄存器中,我不必使用[]?

不,因爲值123將編碼到指令本身。 CPU不必出門到內存來檢索123值。當指令被獲取時,它已經被加載到CPU中。

根據前面的例子,它必須是一個地址。

它可以是一個地址,因爲地址只是一個數字。然而,硬編碼地址不太可能。在現代程序中,所有地址都是相對的,因爲程序可以在內存中移動。

+0

我很困惑。那麼沒有像「註冊地址」這樣的術語,是嗎? –

+0

鑑於小字節序,您應該將值寫爲** DDCCBBAA **。 –

+0

我發現地址爲770000和780000的行尤其令人困惑!你爲什麼寫這些? –