我需要提供一个汇编命令列表,该列表是1字节指令长度到13字节指令:
我在哪里可以找到这样的列表?我可以看到汇编命令和指令长度(以字节为单位)。
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指令具有很多必需的前缀,并且可以使用内存源操作数,因此可以具有较大的寻址模式。
您可以在这里找到有关Intel CPU的手册:https://software.intel.com/en-us/articles/intel-sdm
关于指令编码的完整参考可以在Intel-x86-64b-32b-manul-vol-2-instruction-set-reference-manual.pdf
中找到,您可以在上面的链接中下载。
但是没有这样的简单映射,因为指令是经过编码的,并且它们的长度取决于所涉及的操作码和地址模式。