函数的参数和返回值
首先我们新建一个项目.然后写一点代码.来到main.m文件.
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int sum(int a,int b){
return a + b;
}
int main(int argc, char * argv[]) {
sum(10, 20);
return 0;
}
然后选择真机.断点调试sum函数处.如下图
运行!然后我们看一下汇编代码.选择Xcode的Debug->Debug Workflow->Always Show Disassembly 可以调试查看汇编指令
然后当我们进入到sum函数里面之后.看下sum函数中的汇编指令.如下图
可以看到.参数取出来进行加法运算是从w1和w0(x0,x1的低32位) 里面取出来的.
有了这样一个结论.我们就可以使用ARM汇编.写一个不严谨的求和的函数了
新建一个.s文件,代码如下
.text
.global _suma
_suma:
add x0,x0,x1
ret
main.m文件代码
int suma(int a,int b);
int main(int argc,char * argv[]){
int b = suma(10,20);
printf("%d",b);
return 0;
}
运算结果没问题.
那么我们可以发现.在汇编中,x0保存的是我们函数的返回值.
ARM64下,函数的参数通常情况下是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,就会入栈.
函数的返回值通常情况下是放在X0 寄存器里面的.
ARM汇编入门(一) — 进制本质
ARM汇编入门(二) — 寄存器&pc&bl指令
ARM汇编入门(三) — 寄存器&cpu补充
ARM汇编入门(四) — 栈SP&FP寄存器
ARM汇编入门(五) — bl&ret函数的调用与返回
ARM汇编入门(六) — 函数的参数和返回值
ARM汇编入门(七) — 函数的局部变量与嵌套调用
ARM汇编入门(八) — 状态寄存器
ARM汇编入门(九) — 内存分区全局变量和局部变量
ARM汇编入门(十) — 循环选择判断
待续…