iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
1
Security

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

Day7 - 組合語言- 不可不知之定址模式 - 上篇

多數組合語言指令(instructions)需透過運算元(operand)來存取資料[可以把運算元想像成容器]。有一些指令不需要運算元即可存取資料,而另一些指令需要兩個或兩個以上的運算元以進行操作。我們先來看,當指令需要兩個運算元時的狀況。其語法如下:第一個運算元通常為目的地操作元,第二個運算元為來源地操作元。舉例來說:

mov xxx, yyy

xxx 即為目的地操作元,yyy 為來源地操作元。上述程式碼等價於將 yyy 指派給 xxx。等同:xxx = yyy。一般而言,來源地操作元的資料在操作後不會被修改。而目的地操作元(xxx)與來源地操作元(yyy)的資料的位置通常依照儲存位置可以分成暫存器定址、立即定址、記憶體定址。因此,我們需要明確的辨別想要操作的資料的存取容器類型。

什麼是定址模式?簡單來說,是指 CPU 依據組合語言指令所提供的記憶體位址以尋找實體位置的一種方式。

定指模式(主要分三種)

暫存器定址

我們先來看以下這張圖,第1行中的目的地操作元是一個暫存器(DX),用來儲存 TAX_RATE 操作元的資料;第2行中的來源地操作元也是一個暫存器(CX),用來將 CX 的資料存到 COUNT 目的地操作元;第3行的目的地操作元與來源地操作元都是暫存器,意思是說,將 EBX 的資料存到 EAX。

不難發現,你可以透過暫存器放在隨意的位置、甚至可以拿來接收資料。

MOV DX, TAX_RATE 
MOV COUNT, CX 
MOV EAX, EBX 

立即定址

立即定址使用時機通常是,要定義或指派常數的時候,而其來源地操作元固定是常數。如下圖,第二個參數皆是常數,而第一個參數可以是暫存器或記憶體位置。稍微解釋一下 code,第1行是用 DB 來定義一個 byte 型態的常數,裡頭儲存150;第2行使用 DW 來定義 word 型態的常數,裡頭儲存300(DB與 DW 的關鍵字會在後面說明,可以把它理解成宣告型態);第3行化成數學式是 BYTE_VALUE = BYTE_VALUE + 65;第4行是將0x45指派到 AX 暫存器。

BYTE_VALUE DB 150 
WORD_VALUE DW 300 
ADD BYTE_VALUE, 65 
MOV AX, 45H 

記憶體定址

明日揭曉,敬請期待!

結論

暫存器定址、立即定址、記憶體定址,間單來說,可以理解成 CPU 透過匯流排與記憶體互動時的不同方法。


上一篇
Day6 - 為什麼要使用暫存器?
下一篇
Day8 - 組合語言 - 不可不知的定址模式 - 下篇
系列文
逆向工程 – 從入門到放棄30

1 則留言

0
tlf20918
iT邦新手 5 級 ‧ 2020-09-29 14:05:55

請問一下,立即定址第三行
ADD BYTE_VALUE, 65
為什麼是+5?

@x0mg iT邦新手 5 級 ‧ 2020-09-30 10:20:59 檢舉

+65才對,感謝告知!

我要留言

立即登入留言