完整指令在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