多數組合語言指令(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 透過匯流排與記憶體互動時的不同方法。