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 ................
在內存地址0x760001
到0x760004
我們存儲的值DDCCBBAA
(4個字節)。 在內存地址0x760005
到0x760008
我們已經存儲了值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中。
根據前面的例子,它必須是一個地址。
它可以是一個地址,因爲地址只是一個數字。然而,硬編碼地址不太可能。在現代程序中,所有地址都是相對的,因爲程序可以在內存中移動。
我很困惑。那麼沒有像「註冊地址」這樣的術語,是嗎? –
鑑於小字節序,您應該將值寫爲** DDCCBBAA **。 –
我發現地址爲770000和780000的行尤其令人困惑!你爲什麼寫這些? –