1. 汇编角度看go
2. 《plan9 汇编入门,带你打通应用和底层》讲义
3. 《plan9 汇编入门,带你打通应用和底层》视频地址【这B站里面有很多Go夜读活动视频可以学习】
4. 曹大go源码阅读
5. 曹大源码阅读【汇编篇1】
---------------------【汇编篇2】
6. 曹大博客
7. 字节开源性能强悍的工具库,里面用了不少汇编
go tool compile -S生成的汇编代码中,常见的寄存器解释如下:
- PC:程序计数器,指下一步要执行的程序,伪寄存器PC和硬件寄存器PC作用差不多。
- SP:指向当前栈帧的栈顶。但是生成的汇编代码中都是硬件寄存器不是伪寄存器。
- BP:指向当前栈帧的栈底,函数栈的起始位置(Go编译器会将函数栈空间自动加8,用于存储BP寄存器,跳过这8字节后才是函数栈上局部变量的内存)。
- SB:保存的值就是进程在内存中代码区的起始地址,它主要用来定位全局符号。go汇编中的函数定义、函数调用、全局变量定义以及对其引用会用到这个SB虚拟寄存器,比如runtime.growslice(SB) 函数是全局的,os.Stdout(SB) 常量是全局的。
- FP:主要用来引用函数参数。go语言规定函数调用时参数都必须放在栈上,比如被调用函数使用 first_arg+0(FP) 来引用调用者传递进来的第一个参数,用second_arg+8(FP)来引用第二个参数 ,以此类推,这里的first_arg和second_arg仅仅是一个帮助我们阅读源代码的符号,对编译器来说无实际意义,+0和+8表示相对于FP寄存器的偏移量。