Swift 枚举底层探究

  • 反汇编: Debug -- Debug Workflow -- Always Show Disassembly
  • 内存视图: Debug -- Debug Workflow -- View Memery

探究过程

  • 在生成枚举变量处打上断点,运行程序后汇编会断在第7行,根据汇编猜想底层实现:
movq   $0xa, 0x4942(%rip) // 将0xa(10)存入地址 rip+0x4942
movq   $0x14, 0x493f(%rip) // 将0x14(20)存入地址 rip+0x493f
movq   $0x1e, 0x493c(%rip)
movb   $0x0, 0x493d(%rip)

如何获得 rip 地址:
注意: rip 作为指令指针,存储着 cpu 下一条要执行的指令的地址,一旦 cpu 读取一条指令,rip会自动指向下一条指令(存储下一条指令的地址)
a> 看下一条指令的地址,第八行 0x10000373e
b> 输入 si 单步执行一次,断点停在第8行。并输入 register read rip


  • 验证第一条指令
    使用编程计算器计算内存地址:0x000000010000373e + 0x4942 = 0x100008080,
    在 View Memery 中输入地址验证情况
  • 验证三条 movq 语句
  • 其他信息
    • 通过地址可以看出每条指令所占的空间:0x100003733 ~ 0x10000373e,标明指令 $0xa, 0x4942(%rip) 占12个字节,可以用地址旁边的 <+aa> 减去 上个地址的 <+bb> 来计算指令占的字节数

你可能感兴趣的:(Swift 枚举底层探究)