前言本文是我学习Go汇编的一些心得,网上关于Go的汇编资料实在是太少了,本人计算机不是科班,所以可能会有错误。 进程内存地址空间操作系统执行程序时,会把程序的二进制部分加载进内存,同时分配一定的内存空间。如下图所示 TEXT/Code segmentTEXT segment,或者叫Code segment,保存了程序的指令。
Data segmentData segment 保留着进程初始化的全局和静态的变量。这个数据段可以变为初始化只读区域(initialized read-only area)和初始化读写区域(initialized read-write area)。 Gvar Section一个全局变量初始化和存储在data segment。这个区域可读/写,但是不能在进程之间共享数据。 BSS Section这个section保存着未初始化的数据。 这个section的又叫做零初始化数据section(zero-initialized data section) Heap Sectionheap是进程的线性增长地址空间,当程序使用malloc()获取的动态内存,这份内存就是在heap之中。heap区域是在BSS segement之后,并会“增长”到更高的地址空间。heap区域是所有共享库、动态模块都可见的。
Stack Segment这个Segement保存所有局部变量。当调用函数时,这个函数的局部变量就全部分布在stask上(这个函数就形成了stack frame)。当函数退出时,所有该函数相关的局部变量会自动从stask上退出。其他信息,包括返回地址和局部参数,也是保存在stack的stack frame之上。stack是LIFO(last in first out 先进后出)结构,一般是分配在内存的高地址上,因此是向低位增长,还有每个寄存器,中间值或者stack frame。
跟Go asm有什么关系?Go有几个虚拟寄存器
其中FP和SP的区别如下图所示: 这里有个疑问的地方,啥是符号(symbol),根据Symbol里的解释是:
也就是说例如
就代表指向code segment中代表DEMO函数的内存地址。 寄存器每种CPU都有不同的寄存器,AMD64平台里常用的有以下几个:
了解完内存结构和寄存器后,下一篇将学习各种符号的意义:) 原文地址:https://meng.zhuo.blog/杩涚▼鍐呭瓨鍦板潃绌洪棿 本文转载于微信公众号: Go中国(golangchina),更多微信文章请扫描关注公众号: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|