在项目中新建空白文件empty重命名为.s文件
如下图在ios app项目中新建文件->other->empty->名字改成test.s 下面是2个方法:
- text和 add,text方法不带入参只简单测试几条mov指令
- add带入参,测试带2个入参的加法
- .text的意思是把西面代码放进代码段.因为macho文件,里面的text段就是代码段
- .global 是声明后面的方法名全局可用,否则调用add(int int)方法的时候回报错链接错误:Undefined symbol: _add
- 传递进来的参数前8个都放在x0到x7中,超过8个放在栈中,返回值在x0中
.text
.global _test,_add
_test:
mov x0,#0x1 ;立即数以#井号开头,0x是16进制
mov x1,x0
;mov x2,x0+0x12 ;不合法mov右边不能运算
;ldr w12, [x1, #0x1]
add x2,x1,x0
sub x3,x2,x1
ret
_add:
add x0,x0,x1;传递进来的参数前8个都放在x0到x7中,超过8个放在栈中,返回值在x0中
ret
新建.h头文件声明方法给别的文件使用
test.h文件中只有2行代码,就是声明2个方法
void test();
int add(int,int);
在oc代码中调用方法
需要包含.h文件
#import "test.h"
然后调用方法
test();
int result = add(3, 5);
NSLog(@"result=%d",result);
通过lldb 断点调试验证寄存器结果
下面是在add 方法加了断点,然后使用 si指令调试汇编代码,再用 re read读取寄存器的值验证传入参数是在x0,x1中,返回值在x0中
(lldb) re read x0
x0 = 0x0000000000000003
(lldb) re read x1
x1 = 0x0000000000000005
(lldb) si
(执行完add指令add x0,x0,x1后)
(lldb) re read x0
x0 = 0x0000000000000008
(lldb) c
|