将数字与x86_64程序集中的方法关联的最佳方法是什么

问题描述

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

根据该字节的值,我需要使用特定功能对其他数据进行解码。

例如:

  • 如果该值为0x01,则需要call function1对其进行解码。
  • 对于0x02,执行call function2
  • 依此类推...

我不想使用compare和jump语句对所有内容进行硬编码,因为可能的值超过150个,这将导致超过400行代码。

实现此目标的最佳方法是什么?在C语言中,我将使用一个简单的数组来完成此操作:array[index],其中数组存储函数指针,而索引是操作代码。这将导致O(1)速度。

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

解决方法

是的,在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更方便,则可以使用{{1}}而不是调用使其像函数内的开关一样。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...