每个汇编命令的指令长度表

问题描述 投票:-1回答:2

我需要提供一个汇编命令列表,该列表是1字节指令长度到13字节指令:

  • 1-byte:push,...
  • 2字节:添加al,...
  • 3字节:添加斧头,...
  • 13字节...

我在哪里可以找到这样的列表?我可以看到汇编命令和指令长度(以字节为单位)。

assembly byte x86-64 machine-code code-size
2个回答
2
投票

IDK,您会发现按长度排序的列表,因为大多数指令都采用可编码可变长度寻址模式的ModRM字节。

您可以按最小个长度排序。英特尔的第2卷手册显示了编码,例如HTML提取为https://www.felixcloutier.com/x86/index.html

[http://ref.x86asm.net/coder64.html按1字节和2字节操作码分组,并显示(在o列中)该操作码是否需要ModRM字节来表示操作数。

[https://codegolf.stackexchange.com/questions/132981/tips-for-golfing-in-x86-x64-machine-code有很多关于x86-64机器代码中小的内容的技巧。


顺便说一句,您的示例之一已损坏:

add ax, imm8在64或32位模式下需要16位操作数大小的操作数大小前缀。至少需要4个字节进行编码。 (66h +操作码+ modrm + imm8)。

add ax, imm16可以对隐式AX使用no-modrm简短格式的操作码,但立即数需要一个额外的字节。

或者您是说add r16, r/m16,例如add ax, cx?是的,那是3个字节。但是add ax, [1234 + edi + r8d*4]更是:地址大小前缀(因为我没有使用64位寄存器),SIB,disp32和r8的REX前缀。因此,您不可以将all add ax, ...指令分组为相同大小。即使您排除内存源操作数,add ax, r8w也需要REX前缀。

但是是的,add al, imm8或寄存器有2个字节的编码:8位操作数大小具有其自己的操作码,而不是16/32/64位操作码之前的前缀。

并且是rax..rdi的push / pop寄存器是一个字节。 r8..r15需要REX前缀。


我忘了最长的指令是没有一堆前缀的。例如lock add [fs:disp32 + r10], imm32很大。

或者某些SIMD指令具有很多必需的前缀,并且可以使用内存源操作数,因此可以具有较大的寻址模式。


0
投票

您可以在这里找到有关Intel CPU的手册:https://software.intel.com/en-us/articles/intel-sdm

关于指令编码的完整参考可以在Intel-x86-64b-32b-manul-vol-2-instruction-set-reference-manual.pdf中找到,您可以在上面的链接中下载。

但是没有这样的简单映射,因为指令是经过编码的,并且它们的长度取决于所涉及的操作码和地址模式。

© www.soinside.com 2019 - 2024. All rights reserved.