IA-32指令定址方式
intel 64和IA-32架構中的指令編碼通常包括以下幾個部分:可選的指令字首(字首的順序任意),主操作碼位元組(最多3個位元組),一個定址方式指定位元組(可選,該位元組包含ModR/M位元組以及可選的SIB位元組<scale-index-base>),一個displacement(1,2,4或0個位元組,可選),此外還有一個立即數域(可選,0,1,2,4位元組)。
大多以儲存器做運算元的指令在主操作碼後面都會跟隨一個定址方式位元組(ModR/M),ModR/M包含三類資訊:
mod結合r/m可以組合出32種不同的值:8個暫存器(mod=11時)已經24個不同的定址方式(mod!=11)
reg/opcode用來指定8個暫存器種的一個或者作為指令操作碼的擴充套件部分
r/m部分可以被用來指定一個暫存器運算元或者可以結合mod來指定一種定址模式,某些特殊情形下,mod和r/m被用來指
定操作碼的資訊(當mod和r/m指定定址方式不同的時候,需要額外的一個定址位元組<SIB>。32為定址方式下的base-plus-index和 scale-plus-index需要這個位元組,SIB位元組包含下面三個資訊:
scale: 指定度長
index: 指定用作index的暫存器號
base:指定用作base的暫存器號
displacement和立即數字節
在一些定址模式中,ModR/M後面可以跟隨一個displacement(或者是一個SIB位元組),displacement應該是一個立即數偏移
如果一個指令使用了一個立即數,這個立即數往往跟在一個displacement後面
下圖是 ModR/M編碼規則
下圖是 SIB位元組編碼規則