心声0228 arm64函数参数超过8个崩溃
2024-01-17 本文已影响0人
良友知音
程序调试出现arm64,函数参数超过8个问题程序崩溃。
总结下64汇编知识:
1.函数调用约定是什么约定?
ARM64使用的是ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb过程调用标准)的函数调用约定。
2.函数需要用到到的指令有那些?
B:无条件跳转,一般是函数内部的if、switch条件判断的跳转
Bl:带函数返回值的跳转,一般是用于调用其他的函数。RET:子程序返回指令,返回地址默认保存在X30寄存器(LR链接寄存器)
LR:保存子程序结束后需要执行的下一条指令
PC:表示当前执行的指令的地址。
3.函数的参数怎么存储传递?
3.1. 通常情况下函数的参数存放在X0-X7(32位的为W0-W7)这8个寄存器,如果函数参数超过8个,那么就需要用到栈存储的方式来存储参数。
3.2. 函数参数如果少于8个参数的那么依次从左往右传参,如果多于8个的参数那么依次从右往左进行入栈的。
3.3 函数中8个参数和9个参数的具体情况(不过在开发过程中参数超过8个的情况是比较少的,因此在逆向过程中这种超过8个参数的情况也会比较少的)
3.3.1函数中有八个参数的,直接用寄存器W0-W7表示.
解决方法:
1.优化程序逻辑,减少参数到8个以下,提高程序兼容性,减少出错。
2.修改程序中的内嵌汇编代码,兼容更多的CPU指令。