如何从汇编代码识别C调用的汇编函数的参数数量?
从汇编代码判断函数参数数量的方法
以下是来自cactus_entrypoint.S的汇编代码片段:
func cactus_entrypoint /* Entry reason is primary EC cold boot */ mov x19, #1 secondary_cold_entry: /* Entry reason is secondary EC cold boot */ mrs x0, mpidr_el1 bl platform_get_core_pos /* Setup the stack pointer. */ adr x1, stacks_end mov x2, #CACTUS_STACKS_SIZE mul x2, x0, x2 sub sp, x1, x2
对应的C代码声明为:
extern void cactus_entrypoint(uint64_t arg); extern void secondary_cold_entry(void);
判断依据(基于ARM64调用约定)
ARM64架构遵循AArch64过程调用标准,整数参数通过x0-x7寄存器传递,第一个参数对应x0寄存器。我们可以通过函数对x0的处理逻辑判断参数情况:
cactus_entrypoint带有1个参数
这个函数的第一条指令是mov x19, #1,完全没有修改x0寄存器。这意味着x0保留了调用者传入的原始值——符合ARM64中第一个参数通过x0传递的约定。结合C声明可以确定,这个函数接受一个uint64_t类型的参数(对应x0寄存器的值)。即使当前贴出的代码片段没有直接使用这个参数,也说明函数设计时会保留该参数供后续逻辑使用。secondary_cold_entry无参数
这个函数的第一条指令是mrs x0, mpidr_el1,直接将MPIDR_EL1寄存器的值加载到x0中,完全覆盖了x0的原有内容。如果这个函数需要接收参数,调用者传入的x0值会被直接丢弃,这不符合带参数函数的设计逻辑。因此可以判断该函数不需要任何参数,和C声明的void secondary_cold_entry(void)一致。
内容的提问来源于stack exchange,提问作者syacer
相关产品推荐
相关产品推荐

