我需要提供1字节指令长度到13字节指令的汇编命令列表: 在哪里可以找到这样的列表? 答案 0 :(得分:2) 在IDK中,您可以找到按长度排序的列表,因为大多数指令都使用ModRM字节,该字节可以编码可变长度的寻址模式。 您可以按最小长度进行排序。英特尔的第2卷手册显示了编码,例如在https://www.felixcloutier.com/x86/index.html处提取HTML。 http://ref.x86asm.net/coder64.html按1字节和2字节操作码进行分组,并(在 https://codegolf.stackexchange.com/questions/132981/tips-for-golfing-in-x86-x64-machine-code有很多关于x86-64机器代码中较小内容的提示。 顺便说一句,您的示例之一已损坏: 或者您是说 但是,是的, 是rax的 我忘记了没有一堆前缀的最长指令是什么。例如 或者某些SIMD指令具有很多必需的前缀,并且可以使用内存源操作数,因此可以具有较大的寻址模式。 答案 1 :(得分:1) 您可以在这里找到有关Intel CPU的手册:https://software.intel.com/en-us/articles/intel-sdm 可以在 但是,没有简单的指令长度图,因为指令是经过编码的,它们的长度取决于操作码和涉及的地址模式以及其他参数。 根据您的用例,您可以考虑使用类似capstone:http://www.capstone-engine.org/之类的东西,可以用来分解二进制数据并为您提供有关指令的信息。
我可以看到汇编命令和指令长度(以字节为单位)。2 个答案:
o
列中显示该操作码是否需要ModRM字节来表示操作数。
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]
还有更多:r8的地址大小前缀(因为我没有使用64位寄存器),SIB,disp32和REX前缀。因此,您不可以将 all add ax, ...
条指令分组为相同大小。即使排除内存源操作数,add ax, r8w
也需要REX前缀。add al, imm8
或寄存器有2字节编码:8位操作数大小有其自己的操作码,而不是16/32/64位操作码前面的前缀。 / p>
push
/ pop
寄存器。.rdi是一个字节。 r8..r15需要一个REX前缀。
lock add [fs:disp32 + r10], imm32
很大。Intel-x86-64b-32b-manul-vol-2-instruction-set-reference-manual.pdf
中找到关于指令编码的完整参考,您可以从上面的链接下载该信息。