完整指令在x64 asm代碼中需要的最大字節數是多少?x86_64 ASM - 指令的最大字節數?
像一個跳轉到地址可能佔用多達9個字節,我想:FF 00 00 00 00 11 12 3F 1F,但我不知道這是否是一個64位指令可以使用
的最大字節數完整指令在x64 asm代碼中需要的最大字節數是多少?x86_64 ASM - 指令的最大字節數?
像一個跳轉到地址可能佔用多達9個字節,我想:FF 00 00 00 00 11 12 3F 1F,但我不知道這是否是一個64位指令可以使用
的最大字節數x86指令集(16,32或64位,所有變體/模式)保證/要求指令最多爲15個字節。除此之外的任何內容都會導致「無效的操作碼」。如果不使用冗餘前綴(例如,多個0x66或0x67前綴),則無法實現該功能。
實際需要64位作爲一個數據項的唯一指令是負載常數寄存器(Intel語法:mov reg, 12345678ABCDEF00h
,在&噸語法:movabs $12345678ABCDEF00, %reg
) - 因此,如果你想向前跳超過31個比特/向後,它將把目標位置移動到一個寄存器中,然後調用/跳轉到寄存器。使用32位立即數和位移(在相對跳轉和尋址模式下)可以在64位模式下的多條指令上保存四個字節。
也有'mov'的形式,它可以採用完整的64位地址,這些採用'moffs'作爲操作數。但是它們只能移入/移出累加器,因此它們的最大有用長度仍然只有11個字節(地址8,操作碼1,64或16位操作數大小1,以及1 fs或gs段覆蓋)。 – ughoavgfhw
從64和IA-32架構軟件開發人員手冊:
2.3.11 AVX指令長度
英特爾64和IA-32指令r的最大長度域名爲字節。
您可以構建編碼超過15個字節的指令,但這樣的指令是非法的,並且可能不會執行。
問題是,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
這個答案有什麼問題?爲什麼反對 –
指令集對指令長度沒有限制。該限制由指令解碼器 –
定義386和更高版本的ISA確實施加了15個字節的限制。 286強加了10個字節的限制。 「無限」insn長度的東西只適用於8086,不適用於x86(或x86-64),甚至不適用於實模式下的現代x86 CPU。答案的後半部分應該說「否則有效」。您忽略了該腳註的底部,該腳註說明**避免這些情況由用戶決定(以及由此產生的#GP異常)。** –
[x86上最長的可能的指令是15字節](http://en.wikipedia.org/wiki/Instruction_set) –
注意的是,雖然它可能構造一個長度超過15個字節的單指令(通過使用一串前綴),x86指令解碼器前端將會窒息。 15個字節是一個硬限制。 – duskwuff