x86_64 ASM - 指令的最大字节数?

Joh*_*ing 30 c 64-bit x86 assembly x86-64

完整指令在x64 asm代码中需要的最大字节数是多少?

像跳转到地址这样的东西可能占用多达9个字节我想:FF 00 00 00 00 11 12 3F 1F但我不知道这是否是x64指令可以使用的最大字节数

Mat*_*son 40

x86指令集(16,32或64位,所有变体/模式)保证/要求指令最多15个字节.除此之外的任何内容都会产生"无效的操作码".如果不使用冗余前缀(例如,多个0x66或0x67前缀),则无法实现这一点.

实际上将64位作为数据项的唯一指令是要注册的加载常量(Intel语法:mov reg, 12345678ABCDEF00h,at&t语法:) movabs $12345678ABCDEF00, %reg- 所以如果你想向前/向后跳跃超过31位,那么它将是一个移动将目标位置放入寄存器,然后调用/跳转到寄存器.使用32位立即数和位移(在相对跳转和寻址模式下)可以在64位模式下的许多指令上保存四个字节.

  • 还有一些形式的`mov`可以采用一个完整的64位地址,那些采用`moffs`作为操作数的地址.但它们只能移入/移出累加器,因此它们的最大有用长度仍然只有11个字节(地址为8,操作码为1,64或16位操作数大小为1,1为1) fs或gs段覆盖). (4认同)

phu*_*clv 28

问题是,x86指令集中最长的指令什么?

答:你可以形成一个有无限字节数的有效x86指令!

没错,您可以使用一条有效指令填充整个64K ROM映像.更具体地说,8086指令的长度没有限制.凉!不幸的是,现代i386变体在尝试解码超过15个字节的指令时会引发一般性保护错误.

那么无限长但有效的8086指令是什么样的呢?实际上有点无聊.您只能通过在操作码前面使用冗余前缀来形成无限长的指令.指令前缀是预先写入指令开头的字节,可以修改指令使用的默认地址大小,数据大小或段寄存器.

例如,您可以采取看似无害的指令:

89 E5              mov %sp,%bp
Run Code Online (Sandbox Code Playgroud)

把它变成一条很长的指令:

66 66 66 66 … 66 66 89 E5                mov %sp,%bp
Run Code Online (Sandbox Code Playgroud)

现在那只是邪恶的.

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
Run Code Online (Sandbox Code Playgroud)

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

  • 用于386及更高版本的ISA确实施加了15个字节的限制.286施加了10个字节的限制."无限"insn长度的东西只适用于8086,而不是x86(或x86-64),甚至不是真实模式下的现代x86 CPU.答案的后半部分应该说"其他有效".你遗漏了那个脚注的底部,它说**用户应该避免这些情况(以及由此产生的#GP异常).** (8认同)
  • 指令集对指令长度没有限制。该限制由指令解码器定义 (2认同)
  • @LưuVĩnhPhúc您选择了一个特别糟糕的示例,因为“ lwpins”从未将其制成硅胶。但是,我不知道其他任何过长的说明;VEX很好地缓解了这个问题。 (2认同)

nne*_*neo 17

从英特尔®64和IA-32架构软件开发人员手册:

2.3.11 AVX指令长度

Intel 64和IA-32指令的最大长度保持为15个字节.

您可以构造编码超过15个字节的指令,但这些指令是非法的,可能不会执行.