同intel彙編定址方式都是一樣的,只是語法上有點區別。通用的定址格式如下:
final address = address_or_offset + %base_or_offset + multiplier * %index其中address_or_offset、multiplier都是常量,另外兩個必須是暫存器,還有其中一些欄位是可以省略的,省略掉的字段相當於用0代替。
1. 直接定址
這種定址方式相當於只使用了address_or_offset欄位,定址格式如下:
movl address, %eax例如:
movl 0x0100, %eaxintel語法是:
mov eax, [0100]
2. 變址定址
這裡只用到了address_or_offset和%index兩個字段,index可以是所有的通用暫存器,也同樣可以包含multiplier欄位,例如1, 2, 4,還是來看實際的例子吧(maximum.s):
movl $0, %edidata_items在高階語言中可以叫做陣列吧,這裡相當於把陣列中的第乙個元素拷貝到eax暫存器中。因為data_items定義為long型別,如果edi值為1呢,那麼movl data_items(,%edi,4), %eax這句話相當於把陣列中的第二個元素拷貝到movl data_items(,%edi,4), %eax
暫存器eax中,所以這種定址方式適用於遍歷陣列。
3. 間接定址
movl (%eax), %ebx同intel語法為:
mov eax, [esi]
4. 基址定址
類似於間接定址,例如:
movl 4(%eax), %ebxintel語法為:
mov eax, [ebp-8]
彙編 定址方式
定址方式 1立即定址方式 運算元包含在指令中,作為指令的一部分,跟在操作碼後存放在 段。這種運算元稱為立即數,可以是16位,也可以是8位。前者按照高高低低原則存放。例子 mov ax,1234h 2暫存器定址方式 運算元在cpu內部的暫存器中,指令中指定暫存器號。對於16位運算元,暫存器可以是ax,...
彙編 定址方式
定址方式 1立即定址方式 運算元包含在指令中,作為指令的一部分,跟在操作碼後存放在 段。這種運算元稱為立即數,可以是16位,也可以是8位。前者按照高高低低原則存放。例子 mov ax,1234h 2暫存器定址方式 運算元在cpu內部的暫存器中,指令中指定暫存器號。對於16位運算元,暫存器可以是ax,...
組合語言定址方式(Linux
位址或偏移 基位址暫存器,索引暫存器,比例因子 計算結果 位址或偏移 基位址或偏移量暫存器 比例因子 索引暫存器 其中所有欄位都是可選的。具體如何省略的,會在後面說明。注意,藍色代表使用,綠色代表保被省略的部分。movl 0x1234,eax 通式分解 位址或偏移 基位址暫存器,索引暫存器,比例因子...