x86指令格式

2021-08-03 04:07:42 字數 2984 閱讀 6899

當計算機處理器晶元執行時,它讀取儲存在記憶體中的指令碼。每個指令碼集合可能包含乙個或多個位元組的資訊,這些資訊指示處理器完成特定的任務。每條指令碼都是從記憶體中讀取的,指令碼所需的資料也是儲存在記憶體中並從記憶體中讀取。包含指令碼的記憶體位元組和包含處理器使用的資料的位元組沒有區別。

為了區分資料和指令碼,要使用專門的指標(pointer)幫助處理器跟蹤資料和指令碼儲存在記憶體中的位置。

指令指標(instruction pointer) 用於幫助處理器了解哪些指令碼已經處理過了,以及接下來要處理的是哪條指令碼。有些專門的指令能夠改變指令指標的位置,比如跳轉到程式的特定位置。

資料指標(data pointer) 用於幫助處理器了解記憶體中資料區域的起始位置。這個區域稱為 堆疊(stack),當新的資料元素被放入到堆疊中時,指標在記憶體中「向下」移動。當資料被讀取出堆疊時,指標在記憶體中「向上」移動。

每條指令都必須至少包含1個位元組的操作碼(operation code,簡寫為 opcode)。操作碼定義處理器應該完成什麼操作。每個處理器系列都具有其自己的預定義好的操作碼,它們定義所有可用的功能。

指令碼格式:

ia-32指令碼格式由四個主要部分構成:,

a) 可選的指令字首;

指令字首可以包含1個到4個修改操作碼行為的 1 位元組字首。安裝字首的功能,這些字首被分為 4 個組。修改操作碼時,每個組的字首一次只能使用乙個(因此最多有4 個字首位元組)。這 4 個字首組如下:

@a1@ 鎖定字首和重複字首

鎖定字首表示指令將獨佔的使用共享記憶體區域。這對於多處理器和超級執行緒系統非常重要。

重複字首用於表示重複的功能(常常在處理字串時使用)。

@a2@段覆蓋字首和分支提示字首

段覆蓋字首定義可以覆蓋定義了的段暫存器的指令。

分支提示字首嘗試向處理器提供程式在條件跳轉語句中最可能的路徑的線索(這同預報分支的硬體一起使用)。

@a3@運算元長度覆蓋字首

運算元長度覆蓋字首通知處理器,程式將在這個操作碼之內切換 16 位 和 32 位的運算元長度。這使程式可以再使用大長度的操作碼時警告處理器,幫助加快對暫存器的資料賦值。

@a4@位址長度覆蓋字首

位址長度覆蓋字首通知處理器,程式將切換 16 位 和 32 位的記憶體位址。這兩種長度都可以被宣告為程式的預設長度,這個字首通知處理器程式將切換到另乙個長度

b) 操作碼(opcode)

ia-32指令碼格式中唯一必須的不是就是操作碼。每個指令碼都必須包含操作碼,它定義了處理器執行的基本功能或任務。

操作碼的長度在 1 到 3 位元組之間,它唯一地定義要執行的功能。

例如:2位元組的操作碼 of a2定義了ia-32 cpuid指令。當處理器執行這個指令碼時,它返回不同暫存器中關於微處理器的特定資訊。

注:暫存器是處理器晶元之內的元件,用於臨時儲存處理器正在處理的資料。

c) 可選的修飾符

一些操作碼需要另外的修飾符來定義執行的功能中涉及到什麼暫存器和記憶體位置。修飾符包含在 3 個單獨的值中:

@a1@ 定址方式說明符(modr/w

)位元組modr/w位元組由 3 個字段的資訊構成,如下:

mod 字段 和 r/m 字段一起使用,用於定義指令中使用的暫存器或者定址模式。在指令中,可能的定址模式有 24個,加上 8 個可以使用的通用暫存器,所以又32個可能值。

reg/opcode 字段用於執行使用更多的 3 位 進一步定義操作碼功能(比如操作碼子功能),或者可以用於定義暫存器。

r/m 字段用於定義用作該功能的運算元的另乙個暫存器,或者可以把它和 mod 字段組合在一起定義指令的定址模式。

@a2@ 比例-索引-基址(sib

)位元組sib位元組也由 3 個字段的資訊構成,如下:

比例 字段指定操作的比例因子。

索引 字段指定記憶體訪問中用作索引暫存器的暫存器。

基址 字段指定用作記憶體訪問的基址暫存器的暫存器。

modr/m 和 sib 位元組的組合建立乙個表,它可以定義用於訪問資料的眾多可能的暫存器組合和記憶體模式。

@a3@ 1,2或4個的位址移位位元組

位址移位 位元組用來指定對於 modr/w 和 sib 位元組中定義的記憶體位置的偏移量。可以使用它作為基本記憶體位置的索引,用於儲存或者訪問記憶體的資料。

d) 可選的資料元素

指令碼的最後一部分是該功能使用的資料元素。

一些指令碼從記憶體位置或者處理器暫存器讀取資料,而一些指令碼在其本身之內包含資料。這個值經常被用於表示靜態數字值(比如要加的數字)或者記憶體位置。根據資料長度,這個值可以包含 1,2,或者 4 位元組的資訊。

例子:指令碼:c7 45 fc 01 00 

00 00

它定義操作碼 c7,這個操作碼是把值傳送到記憶體位置的指令。

修飾符 45 fc 定義了記憶體位置(它定義從 esp 暫存器中的值(值 45)指向的記憶體位置開始的 4 個位元組(值fc))。

最後 4 個位元組定義放到這個記憶體位置的整數值(在當前例子中這個值是 1)。

注:從這個例子可以看出,值 1 被寫為 4 個位元組的 十六進製制值 01 00 00 00。資料流中的位元組的順序取決於是用的處理器的型別。

ia-32平台處理器使用「小端(little-endian)」表示法。其中低值的位元組首先出現(當從左到有讀取)。

其他處理器使用「大端(bit-endian)」表示法,其中高值位元組首先出現。

在組合語言程式中指定資料和記憶體位置值時,這一概念非常重要。

微機原理 五 80x86指令格式

8086指令系統採用了一種靈活的,由1 6個位元組組成的變字長的指令格式,包括操作碼,定址方式以及運算元三個部分 通常指令的第一位元組為操作碼位元組 opcode 規定指令的操作型別.第二位元組為定址方式位元組 mod 規定運算元的定址方式 接著以後的3 6位元組依據指令的不同而取捨 第一位元組為操...

ARM指令集和X86指令集的比較

指令的強弱是cpu的重要指標,指令集是提高微處理器效率的最有效工具之一。從現階段的主流體系結構講,指令集可分為複雜指令集 cisc 和精簡指令集 risc 兩部分。相應的,微處理隨著微指令的複雜度也可分為cisc及risc這兩類。cisc 是一種為了便於程式設計和提高記憶體訪問效率的晶元設計體系。在...

intel X86指令格式分析

先說一下暫存器編號 0 1 2 3 4 5 6 7 eax ecx edx ebx esp ebp esi edi intel指令格式如下圖所示 mod為00 01和10時,r m 000 eax 時,有效位址分別是 eax disp8 eax 和disp32 eax mode為11時,運算元是暫存...