【问题标题】:What's the best way to associate a number with a method in x86_64 assembly将数字与 x86_64 程序集中的方法相关联的最佳方法是什么
【发布时间】:2020-09-16 14:09:11
【问题描述】:

我有一个服务器套接字,它从客户端接收一个字节(操作码)。

根据该字节的值,我需要使用特定函数解码更多数据。

例如:

  • 如果值为0x01,我需要call function1解码。
  • 对于0x02,执行call function2
  • 等等……

我不想用比较和跳转语句硬编码,因为有超过 150 个可能的值,这将导致 400 多行代码。

实现这一点的最佳选择是什么,从而产生最干净的代码?在 C 语言中,我会用一个简单的数组来做到这一点:array[index] 其中数组存储函数指针,索引是操作代码。这将导致 O(1) 速度。

这只是一个一般性问题,但如果有帮助,我正在使用具有 NASM 语法的 x86_64 asm。

【问题讨论】:

    标签: assembly x86-64 nasm function-pointers


    【解决方案1】:

    是的,函数指针表也是 asm 中显而易见的方式。
    call [dispatch_table + rax*8] 在非 PIE / 非 PIC 代码中,其中标签地址本身为 can fit in a 32-bit sign-extended value,因此您可以将标签与其他标签一起使用寄存器,否则使用 RIP 相关的 LEA 将表基数放入另一个寄存器。 (如果需要示例,请查看函数指针调度的 C 编译器输出。)

    不要忘记首先验证输入,例如cmp eax, MAX_FUNC_NUMBER / ja error,在您使用 movzx eax, byte [mem] 将零扩展字节加载到 RAX 以对索引进行零扩展之后。

    或者只是一个jmp,而不是调用,让它像一个函数中的一个开关,如果这比一个推送返回地址的call更方便的话。

    【讨论】:

      猜你喜欢
      • 2012-03-16
      • 2011-03-28
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多