OC底层探索(二): 编译器优化

准备

汇编指令

image.png

  • main函数中实现以上代码
  • 加上断点,运行

查看汇编代码

image.png

  • 可以使用 register read 来读取寄存器
  • w 表示32位的寄存器,x 表示64位的寄存器
  • 由于使用的是int 类型,只有 4个字节最多占用32位,所以使用w寄存器

image.png

  • 打印w9可以看到就是10, mov 表示将#0xa赋值到w9

image.png

  • stur 是将寄存器w9的内存取出来10,存到x29 - 0x14这块栈地址上,其实就a = 10的赋值过程,x29 - 0x14 = &a
  • mov w9, #0x14 让后再将0x14也就是20 赋值给 w9

image.png

  • 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

打印所以的寄存器

image.png
可以看出 返回值放在了 x0中存储

打开编译器优化

image.png
在看一下汇编代码

image.png

image.png

  • 可以看出中间省了很多的步骤,直接可以从w8中打印出结果
  • 所有在打release 编译器会帮我默认打开 fastest and smallest,这样更能节省性能
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享