13 汇编分析String、Array的结构

文章目录
  • 0x30是数字0的ascii码
  • tag pointer 干嘛用的?直接将内容放在变量的地址中
  • rax rdx 两个寄存器存储返回值,rdi rsi rdx存储参数,可以创建一个多参数函数,验证。

长度大于0xf 的存储情况:

  1. rax 长度
  2. rdx 地址,地址-0x7ffffffffffffe0=真实存储地址

内存分布情况:

  1. 代码区
  2. 常量区
  3. 全局区
  4. 堆区
  5. 栈区

内存布局图:

  1. mach-o
  2. 运行内存
  3. 动态库

小技巧: 字符串的真实地址 : 后面的地址+0x20

小技巧:1后面跟着4个0 一般是全局区,如果不是那么一般是堆区

append干了什么事情: 变为堆空间, 跳过32字节,后面就是内容是存储的真实字符串

小小总结:

  1. 字符串长度<=0xf 字符串内容直接存储在变量的内存中
  2. 字符串的长度>0xf,字符串存放在常量区(__TEXT.cstring),地址信息存储在在变量的后8自己中,真实地址= 后面的地址+0x20
  3. append 后有大于0xf,会开辟空间

dyld_stub_binder

  1. stub 翻译为符号
  2. 动态库中的函数,加载完动态库才能知道(也就是运行的时候才知道),那么编译的时候怎么办? 放置一个占位地址,这个函数就是一个占位地址

数组的内存结构

arr占用8字节,这8字节存储着堆空间地址,堆空间结构:

  1. 引用计数
  2. 元素数量
  3. 数组容量
  4. 元素1
  5. 元素2
  6. 元素3
  7. 元素n