2013-02-05 72 views
25

完整指令在x64 asm代碼中需要的最大字節數是多少?x86_64 ASM - 指令的最大字節數?

像一個跳轉到地址可能佔用多達9個字節,我想:FF 00 00 00 00 11 12 3F 1F,但我不知道這是否是一個64位指令可以使用

的最大字節數
+8

[x86上最長的可能的指令是15字節](http://en.wikipedia.org/wiki/Instruction_set) –

+1

注意的是,雖然它可能構造一個長度超過15個字節的單指令(通過使用一串前綴),x86指令解碼器前端將會窒息。 15個字節是一個硬限制。 – duskwuff

回答

30

x86指令集(16,32或64位,所有變體/模式)保證/要求指令最多爲15個字節。除此之外的任何內容都會導致「無效的操作碼」。如果不使用冗餘前綴(例如,多個0x66或0x67前綴),則無法實現該功能。

實際需要64位作爲一個數據項的唯一指令是負載常數寄存器(Intel語法:mov reg, 12345678ABCDEF00h,在&噸語法:movabs $12345678ABCDEF00, %reg) - 因此,如果你想向前跳超過31個比特/向後,它將把目標位置移動到一個寄存器中,然後調用/跳轉到寄存器。使用32位立即數和位移(在相對跳轉和尋址模式下)可以在64位模式下的多條指令上保存四個字節。

+3

也有'mov'的形式,它可以採用完整的64位地址,這些採用'moffs'作爲操作數。但是它們只能移入/移出累加器,因此它們的最大有用長度仍然只有11個字節(地址8,操作碼1,64或16位操作數大小1,以及1 fs或gs段覆蓋)。 – ughoavgfhw

15

從64和IA-32架構軟件開發人員手冊:

2.3.11 AVX指令長度

英特爾64和IA-32指令r的最大長度域名爲字節。

您可以構建編碼超過15個字節的指令,但這樣的指令是非法的,並且可能不會執行。

18

問題是,x86指令集中最長的指令是什麼?

答案:你可以形成一個有效的x86指令,其中有一個無限的字節數

沒錯,你可以用一條有效的指令來填滿整個64K ROM鏡像。更具體地說,8086指令的長度沒有限制。涼!不幸的是,當嘗試解碼超過15個字節的指令時,現代i386變體會引發一般保護錯誤。

那麼無限長而有效的8086指令是什麼樣的?實際上有點無聊。您只能通過在操作碼上使用冗餘前綴來形成無限長的指令。指令前綴是預先寫入指令開始處的字節,可以修改指令使用的默認地址大小,數據大小或段寄存器。

例如,你可以採取無害尋找指令:

89 E5    mov %sp,%bp 

,把它變成一個很長的指令:

66 66 66 66 … 66 66 89 E5    mov %sp,%bp 

現在這只是邪惡。

https://web.archive.org/web/20131109063453/https://www.onlinedisassembler.com/blog/?p=23


另一個長指令不重複前綴

在一些情況下,可以以編碼超過傳統的15字節長度的限制有效的指令。例如:

; 16-bit mode 
    F2 F0 36 66 67 81 84 24 disp32 imm32 = xaquire lock add [ss:esp*1+disp32],imm32 
    F3 F0 36 66 67 81 84 24 disp32 imm32 = xrelease lock add [ss:esp*1+disp32],imm32 

    ; 16-bit mode 
    36 67 8F EA 78 12 84 24 disp32 imm32 = lwpins eax,[ss:esp*1+disp32],imm32 
    36 67 8F EA 78 12 8C 24 disp32 imm32 = lwpval eax,[ss:esp*1+disp32],imm32 
    36 67 8F EA 78 10 84 24 disp32 imm32 = bextr eax,[ss:esp*1+disp32],imm32 

    ; 64-bit mode 
    64 67 8F EA F8 12 84 18 disp32 imm32 = lwpins rax,[fs:eax+ebx+disp32],imm32 
    64 67 8F EA F8 12 8C 18 disp32 imm32 = lwpval rax,[fs:eax+ebx+disp32],imm32 
    64 67 8F EA F8 10 84 18 disp32 imm32 = bextr rax,[fs:eax+ebx+disp32],imm32 

http://www.sandpile.org/x86/opc_enc.htm

+0

這個答案有什麼問題?爲什麼反對 –

+0

指令集對指令長度沒有限制。該限制由指令解碼器 –

+4

定義386和更高版本的ISA確實施加了15個字節的限制。 286強加了10個字節的限制。 「無限」insn長度的東西只適用於8086,不適用於x86(或x86-64),甚至不適用於實模式下的現代x86 CPU。答案的後半部分應該說「否則有效」。您忽略了該腳註的底部,該腳註說明**避免這些情況由用戶決定(以及由此產生的#GP異常)。** –