Swift 汇编分析结构体

2020-09-23  本文已影响0人  十一_7a9c

结构体

在Swift标准库中,绝大多数的公开类型都是结构体,而枚举和类只占很小一部分。

比如Bool、int、Double、String、Array、Dictionary等常见的类型都是结构体

所有的结构体都有一个编译器自动生成的初始化器

调用的时候所有成员的值都要初始化,否则报错,保证所有成员都要有初始值

一旦在定义结构体时自定义了初始化器,编译器就不会在帮他自动生成其他初始化器(调用init方法)

结构体是值类型 (枚举也是值类型)

值类型函数创建存储在栈空间,指针变量的地址存储在栈空间,但是地址指向的内容存储在堆空间 

窥探初始化器的本质

结构体_01

汇编代码分析

汇编_01

首先会调用init方法进入函数内部,找到立即数:movq  $0x0,-0x10(%rbp)和movq  $0x0,-0x8(%rbp)这里就是给两个局部变量赋值分配内存空间

结构体分析

结构体-02 汇编_02

汇编代码分析

 movl  $0xa, %eax                           10赋值给eax寄存器,eax属于rax,所以10复制给rax寄存器

 movq  %rax, %rdi                           10赋值给rdi寄存器

 movl  $0x14, %eax                          20->eax->rax

 movq  %rax, %rsi                             20->rsi

中间有一步调用函数将rdi赋值给rax,rsi赋值给rdx

movq  %rax,0x662d(%rip)                将10赋值给一个地址其实就是p1的内存地址 占8个字节

 movq  %rdx,0x662e(%rip)               将20赋值给rip+0x662e这个地址,10和20是连续的16个字节

 movq  0x6603(%rip), %rax              取出rip+0x6603的地址,其实就是0x662d(%rip)的地址,rip是不相同的   也就是将10复制给rax寄存器

movq  %rax,0x660c(%rip)    rip+0x660c  =0x100000bfc+0x660c      p2的内存地址

 movq  0x65fd(%rip), %rax    20


上一篇 下一篇

猜你喜欢

热点阅读