4Manuals

  • PDF Cloud HOME

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

    如何在不使用标签的情况下跳至特定行? 大型组件386/8086中的寻址模式 装配XMM寄存器8至15 在装配体8086(DOSBox)中为正方形动画的想法 如何在x86处理器上实现“锁定添加” 使用shellcode调用x86本地函数 函数调用返回时,压入堆栈的参数会怎样? gcc内置程序的源代码在哪里? 如何从x64程序集中的堆栈中获取参数? 为什么SHL AL并不总是将寄存器AL乘以2

我需要提供1字节指令长度到13字节指令的汇编命令列表:

  • 1个字节:推送,...
  • 2字节:添加al,...
  • 3字节:添加斧头,...
  • 。
  • 。
  • 。
  • 13字节...

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

2 个答案:

答案 0 :(得分:2)

在IDK中,您可以找到按长度排序的列表,因为大多数指令都使用ModRM字节,该字节可以编码可变长度的寻址模式。

您可以按最小长度进行排序。英特尔的第2卷手册显示了编码,例如在https://www.felixcloutier.com/x86/index.html处提取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]还有更多:r8的地址大小前缀(因为我没有使用64位寄存器),SIB,disp32和REX前缀。因此,您不可以将 all add ax, ...条指令分组为相同大小。即使排除内存源操作数,add ax, r8w也需要REX前缀。

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

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


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

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

答案 1 :(得分:1)

您可以在这里找到有关Intel 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/之类的东西,可以用来分解二进制数据并为您提供有关指令的信息。



Similar searches
    为什么SSH无法缓慢发送版本字符串 使用VB.Net将字符串上传到Amazon s3存储桶 自定义的多重身份验证防护,可启用学生登录 将JSON对象转换为protobuf IStruct 如何知道Featuretools生成的功能类型?