在 x86_64 程序集中将数字与方法相关联的最佳方法是什么
What's the best way to associate a number with a method in x86_64 assembly
我有一个服务器套接字,它从客户端接收一个字节(操作代码)。
根据该字节的值,我需要使用特定函数解码更多数据。
例如:
- 如果值为
0x01
,我需要 call function1
对其进行解码。
- 对于
0x02
,执行call function2
- 等等...
我不想用比较和跳转语句对所有内容进行硬编码,因为有超过 150 个可能的值,这将导致 400 多行代码。
实现此目的的最佳选择是什么,从而产生最干净的代码?在 C 语言中,我会用一个简单的数组来做到这一点: array[index]
其中数组存储函数指针,索引是操作代码。这将导致 O(1) 速度。
这只是一个一般性问题,但如果有帮助,我正在使用 x86_64 asm 和 NASM 语法。
是的,table 函数指针也是 asm 中的明显方式。
non-PIE / non-PIC 代码中的 call [dispatch_table + rax*8]
标签地址本身 can fit in a 32-bit sign-extended value 因此您可以将标签与其他寄存器一起使用,否则使用 RIP-relative LEA 获取table 基地进入另一个寄存器。 (如果需要示例,请查看 function-pointer 分派的 C 编译器输出。)
不要忘记先验证输入,例如cmp eax, MAX_FUNC_NUMBER
/ ja error
,在你使用 movzx eax, byte [mem]
将 zero-extending 字节加载到 RAX 之后 zero-extend 索引。
或者只是一个 jmp
而不是调用使其像函数内的一个开关,如果这比 call
推送一个 return 地址更方便的话。
我有一个服务器套接字,它从客户端接收一个字节(操作代码)。
根据该字节的值,我需要使用特定函数解码更多数据。
例如:
- 如果值为
0x01
,我需要call function1
对其进行解码。 - 对于
0x02
,执行call function2
- 等等...
我不想用比较和跳转语句对所有内容进行硬编码,因为有超过 150 个可能的值,这将导致 400 多行代码。
实现此目的的最佳选择是什么,从而产生最干净的代码?在 C 语言中,我会用一个简单的数组来做到这一点: array[index]
其中数组存储函数指针,索引是操作代码。这将导致 O(1) 速度。
这只是一个一般性问题,但如果有帮助,我正在使用 x86_64 asm 和 NASM 语法。
是的,table 函数指针也是 asm 中的明显方式。
non-PIE / non-PIC 代码中的 call [dispatch_table + rax*8]
标签地址本身 can fit in a 32-bit sign-extended value 因此您可以将标签与其他寄存器一起使用,否则使用 RIP-relative LEA 获取table 基地进入另一个寄存器。 (如果需要示例,请查看 function-pointer 分派的 C 编译器输出。)
不要忘记先验证输入,例如cmp eax, MAX_FUNC_NUMBER
/ ja error
,在你使用 movzx eax, byte [mem]
将 zero-extending 字节加载到 RAX 之后 zero-extend 索引。
或者只是一个 jmp
而不是调用使其像函数内的一个开关,如果这比 call
推送一个 return 地址更方便的话。