如何解决将数字与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}}而不是调用使其像函数内的开关一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。