iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
1
Security

逆向工程 – 從入門到放棄系列 第 8

Day8 - 組合語言 - 不可不知的定址模式 - 下篇

昨天我們知道:暫存器定址、立即定址、記憶體定址,是CPU 透過匯流排與記憶體互動時的不同方法。今天,來說明記憶體的定址方式。

記憶體定址

分成三類,直接存取、直接偏移與間接存取。

直接存取

顧名思義,就是透過記憶體位置直接存取該資料。不過這樣的方式有個缺點,就是存取速度較為緩慢,因為系統需要多花費運算去找到該記憶體位置,縱然比較直觀。其語法如下,

ADD BYTE_VALUE, DL 
MOV BX, WORD_VALUE 

;e.g.
ADD 0xffff0567, DL
MOV BX, 0xffff4231 

我們可以看到,不管是將記憶體的資料移動到暫存器或相反,都行得通。

直接偏移

直接偏移就是透過運算的方式存取記憶體資料。舉下圖來說明。首先,第1-2行,定義兩個表格,分別是 byte 與 word,裡頭分別儲存一些數值。接著,我們可以透過中括弧或是+號等數學符號進行資料的存取(可以把它想像陣列的存取方式)。第4-5行都是存取 BYTE_TABLE 的的第三欄位(因為存取的位置是從0起算)的資料(也就是22這個數值),而第6-7行存取的是 WORD_TABLE 的第四欄位的資料(也就是123這個數值)。

BYTE_TABLE DB 14, 15, 22, 45  
WORD_TABLE DW  134, 345, 564, 123 

MOV CL, BYTE_TABLE[2]
MOV CL, BYTE_TABLE + 2
MOV CX, WORD_TABLE[3]
MOV CX, WORD_TABLE + 3

間接存取

間接存取就是透過[暫存器](被括弧的暫存器)來進行陣列的存取。舉例如下,第1行,先配置一個10個 word (每個 word 佔 2 bytes )的空間名稱為 MY_TABLE,並且將每個數值初始化為0。第2行,將 MY_TABLE 的第一個元素的記憶體位址存到 EBX (透過[]可以取得該變數的記憶體位置)。接著,第3行,將110存入 MY_TABLE[0](等同:MY_TABLE[0] = 110),第4行,將 EBX+2,意思是說,將 EBX 移動到下個元素的記憶體位置(注意因為,每個 word 為兩個 byte,若定義為ㄧ個 byte,EBX+1 就好)。最後,第5行,將123存入 MY_TABLE[1](等同:MY_TABLE[1] = 123)。

不難發現,間接存取就是透過 EBX 來取代陣列的存取。

MY_TABLE TIMES 10 DW 0 
MOV EBX, [MY_TABLE] 
MOV [EBX], 110 
ADD EBX, 2 
MOV [EBX], 123

結論

恭喜閱讀完記憶體的存取方式!明日正式進入各式的組合語言指令介紹~


上一篇
Day7 - 組合語言- 不可不知之定址模式 - 上篇
下一篇
Day9 - 閒來無事,何不來學學 Intel x86 指令?
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言