准备
- 在
main
函数中实现以上代码 - 加上断点,运行
查看汇编代码
- 可以使用
register read
来读取寄存器 w
表示32
位的寄存器,x
表示64位
的寄存器- 由于使用的是
int
类型,只有4
个字节最多占用32
位,所以使用w
寄存器
- 打印
w9
可以看到就是10
,mov
表示将#0xa
赋值到w9
stur
是将寄存器w9
的内存取出来10
,存到x29 - 0x14
这块栈地址上,其实就a = 10
的赋值过程,x29 - 0x14 = &a
mov w9, #0x14
让后再将0x14
也就是20
赋值给w9
str w9 [sp, #0x18]
, 然后再将w9
取出20
放到栈
地址+0x18
上,sp+0x18 = &b
,也就是b
的赋值ldur w0, [x29, -#0x14]
, 上一已经得到[x29, -#0x14]
其实在栈上a
的地址,这一步就是把10
取出来 存到w0
寄存器中ldr w1, [sp, #0x18]
,[sp, #0x18
栈上b
,把20
取出存到w1
中ldur, ldr
都是将内存中的价值到寄存中,只不过用于-
一个用于+
stur, str
将 寄存器的放找内存中,一个用于-
一个用于+
str w8 [sp, #0x10]
, 将w8
中的存到sp+0x10
地址中, 上边可以看到w8 = 0x0
bl sum main.m13
跳转到函数sum
打印所以的寄存器
可以看出 返回值放在了 x0
中存储
打开编译器优化
在看一下汇编代码
- 可以看出中间省了很多的步骤,直接可以从
w8
中打印出结果 - 所有在打
release
编译器会帮我默认打开fastest and smallest
,这样更能节省性能
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END