>我需要给出一个汇编命令列表,该命令长度为1字节指令长度到13字节指令:
- 1 字节:推送、...
- 2 字节:添加 al、...
- 3 字节:添加 ax、...
- .
- .
- .
- 13字节...
我在哪里可以找到这样的列表?
我可以看到汇编命令和以字节为单位的指令长度。
IDK,您可以在其中找到按长度排序的列表,因为大多数指令采用可以编码可变长度寻址模式的 ModRM 字节。
您可以按最小长度排序。 英特尔的 vol.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
可以使用no-modrm短格式操作码来表示隐式AX,但需要额外的字节来表示即时。
或者你的意思是add r16, r/m16
,像add ax, cx
? 是的,这是 3 个字节。 但add ax, [1234 + edi + r8d*4]
更多:地址大小前缀(因为我没有使用 64 位寄存器(、SIB、disp32 和 r8 的 REX 前缀。 因此,您不能将所有add ax, ...
指令分组到相同的大小中。 即使排除内存源操作数,add ax, r8w
也需要 REX 前缀。
但是,是的,有一个 2 字节编码用于add al, imm8
或寄存器:8 位操作数大小有自己的操作码,而不是 16/32/64 位操作码前面的前缀。
是的,push
/pop
注册 rax。RDI 是一个字节。r8..r15 需要一个 REX 前缀。
我忘记了没有一堆前缀的最长指令是什么。 例如lock add [fs:disp32 + r10], imm32
很大。
或者某些 SIMD 指令有很多强制性前缀,并且可以使用内存源操作数,因此可以具有较大的寻址模式。
您可以在此处找到英特尔 CPU 的手册: https://software.intel.com/en-us/articles/intel-sdm
有关入侵编码的完整参考可以在Intel-x86-64b-32b-manul-vol-2-instruction-set-reference-manual.pdf
中找到,您可以通过上面的链接下载。
然而,指令长度没有简单的映射,因为指令是编码的,它们的长度取决于操作码和所涉及的寻址模式以及其他参数。
根据您的用例,您可以考虑使用类似 capstone: http://www.capstone-engine.org/的东西,您可以使用它来反汇编二进制数据并为您提供有关指令的信息。