- x86匯編與逆向工程:軟件破解與防護的藝術(shù)
- (美)斯蒂芬妮·多馬斯 (美)克里斯托弗·多馬斯
- 633字
- 2025-02-10 16:05:44
2.5 內(nèi)存訪問
32位(或64位)的系統(tǒng)只有有限的寄存器。忽略用于追蹤棧的特殊寄存器和通用寄存器(如esp和ebp)后,只剩下六個可用于一般計算的寄存器(如eax、ebx、ecx、edx、esi和edi),這就是程序還需要能夠讀取內(nèi)存數(shù)據(jù)和向內(nèi)存中寫入數(shù)據(jù)的原因。
在x86匯編Intel語法中,內(nèi)存訪問是使用[]符號來表示的。例如,存儲在0x12345678地址的數(shù)據(jù)可以通過[0x12345678]來訪問。內(nèi)存地址也可以存儲在寄存器中,如指令[eax]。
指定數(shù)據(jù)長度
當(dāng)從內(nèi)存獲取數(shù)據(jù)時,不僅需要知道數(shù)據(jù)的存儲地址,還需要知道要訪問的內(nèi)存量。例如,指令[0x12345678]并沒有指明程序需要一個字節(jié)、一個字、一個雙字,還是更多。

圖2.7 x64常用的寄存器
來源:Bobmon/Wikimedia Commons/CC BY-SA 4.0.

圖2.8 r8寄存器的各個部分
在某些情況下,可以從上下文中推斷出需要訪問的數(shù)據(jù)的長度。例如,在指令mov eax,[0x12345678]中,從內(nèi)存中獲取的數(shù)據(jù)將被儲存在eax中。由于eax是一個32位寄存器,程序必然需要請求32位的數(shù)據(jù)。
事實并非總是這樣。例如,考慮指令mov[0x12345678], 1,它會將值1放到內(nèi)存中的特定地址。但是,這個指令并沒有明確被設(shè)定的值的長度。我們應(yīng)該將1看作是一個字節(jié)(00000001)、一個字(0000000000000001),還是一個雙字(00000000000000000000000000000001)呢?為了明確和精簡,我們經(jīng)常會去除前導(dǎo)零,所以以上都是有效解釋。
提示:傳統(tǒng)上,32位的x86架構(gòu)應(yīng)該有32位的字。然而,為了向后兼容16位的x86架構(gòu),所以字的長度是16位,而雙字則是32位。
當(dāng)內(nèi)存訪問的大小沒有被隱式地指出時,必須在指令內(nèi)明確指明。例如,指令byte[100]訪問位于地址100的字節(jié),word[ebx]訪問ebx指向的字,dword[ax]訪問ax指向的雙字。圖2.9展示了以下三條指令之間的區(qū)別。


圖2.9 比較不同大小的mov指令
- MATLAB與C/C++混合編程
- 21天學(xué)通C++(第7版)
- 架構(gòu)基礎(chǔ):從需求到架構(gòu)
- 大模型入門:技術(shù)原理與實戰(zhàn)應(yīng)用
- 軟件架構(gòu)的藝術(shù)
- CATIA V5 從入門到精通(第二版)
- 內(nèi)容理解:技術(shù)、算法與實踐
- 區(qū)塊鏈核心算法解析
- 軟件開發(fā)大講堂·從入門到精通-第一輯(套裝共5冊)
- 項目實踐精解:基于EJB 3.0和Web Services的Java應(yīng)用開發(fā)
- 構(gòu)建跨平臺APP:jQuery Mobile移動應(yīng)用實戰(zhàn)(第2版) (跨平臺移動開發(fā)叢書)
- 深入理解Prometheus監(jiān)控系統(tǒng)
- 芯片改變世界
- 劍指大前端全棧工程師(全2冊)
- Vue.js 3企業(yè)級項目開發(fā)實戰(zhàn)(微課視頻版)