IA32體系結構3(x86機器碼概述)

歸根結底,處理器只認識機器語言,處理器會按照機器碼的指示進行動作。

x86體系結構使用指令長度可變的機器語言,一條機器碼指令可以從1字節到13字節不等。這個跟ARM還是有很大區別,ARM32位處理器的話,是定長指令,是32位長度。

8086~80286使用16位指令模式,80386以上處理器也可以工作在16位指令模式,兩者是兼容的。16位模式和32位模式,其指令機器碼格式有一些差別,具體格式如下:

32位指令格式的頭兩個字節,因爲不常出現,所以稱爲超越前綴(override prefix)。第一個字節用來修改指令操作數地址的長度,第二個字節修改寄存器長度。如果80386以上按16位指令模式的機制操作(實模式或保護模式),而使用32位寄存器,則指令的前面出現寄存器長度前綴66H。如果按32位指令模式操作(只在保護模式),而且使用32位寄存器,則不存在寄存器長度前綴。如果在32位指令模式中出現16位寄存器,則要使用寄存器長度前綴選擇16位寄存器。在帶有前綴的指令中,前綴把寄存器及操作數地址的長度從16位轉換到32位,或是從32位轉換到16位。注意,16位指令模式用8位及16位寄存器和尋址方式,而32位指令模式使用8位及32位寄存器和尋址方式,這是默認的用法。前綴可超越這些默認值,因此32位寄存器可以用於16位模式,而16位寄存器可以用於32位模式。

操作碼

操作碼一般爲1~2字節。

1.第一個字節

第一個字節格式爲(大部分情況,不是所有指令都是這個格式):

(1).前6位表示不同的操作碼。

(2).D-數據流方向

D=1,數據從位於指令第二個字節的R/M字段流向寄存器(REG)字段。

D=0,數據從REG字段流向R/M字段。

(3).W-字節或字或雙字

w=0,數據長度是字節

w=1,數據長度是字或者雙字(80386以上爲雙字)

2.第2個字節

第二個字節格式爲:

(1)MOD字段

MOD字段規定指令的尋址方式,MOD字段選擇尋址類型及所選的類型是否有位移量。下表列出了在沒有操作數地址長度超越前綴(67H)時,16位指令模式下MOD字段各種可能的取值。如果MOD字段的內容是11,它選擇寄存器尋址模式。寄存器尋址用R/M字段指定一個寄存器而不是存儲單元。如果MOD字段的內容是00,01,10,R/M字段選擇數據存儲器尋址方式之一。當MOD字段選擇了數據存儲器尋址方式時,00表示尋址方式沒有位移量,01表示包含8位符號擴展的位移量,10表示包含16位的位移量。比如MOV AL,[DI]指令沒有使用位移量,MOV AL,[DI+2]指令用8位的位移量(+2),MOV AL,[DI+1000H]指令用16位的位移量(+1000H)。

如果是80386及以上處理器,MOD=01,表示8位的位移量,MOD=10,表示32位的位移量。

下表表示REG字段和R/M字段(MOD=11)寄存器的分配情況:

如果MOD字段是00,01或者10,則R/M按新的意義理解,編程尋址方式的定義。以下是16位尋址方式對應的R/M代碼:

以下是32位尋址方式對應的R/M代碼:

以上爲常見機器碼的相關格式,因x86屬於複雜指令集,指令種類非常多,不是所有指令都符合這些規則,但是那些指令比較少用到,至少linux0.11內核裏面基本沒有用到。

以上信息來源於《intel微處理器結構、編程與接口》第六版。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章