分享
  1. 首页
  2. 文章

plan9 汇编

不争_900c · · 1971 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

声明

golang使用的是plan9汇编,不少调度的底层代码都是通过plan9实现,因此了解plan9汇编对Go源码剖析有非常重要的意义,以下的内容均针对golang中使用的plan9汇编。
汇编知识比较杂,如果有需要可以专门去学,本文只是为了看懂golang使用的汇编代码,因此只是简单介绍。
以下内容均来自网上整理,非原创,如有雷同,见谅。

通用寄存器

rax, rbx, rcx, rdx, rdi, rsi, r8~r15 共15个通用寄存器。
在golang中这些寄存器对应了R1-R15,对应关系如下

硬件寄存器 Golang中的表示
rax R1
rbx R2
rcx R3
rdx R4
rdi R5
rdi R6
rsi R7
r8-r14 R8-14
rip(pc) R15

在golang汇编中还出现了R29之类的寄存器 都可以理解为通用寄存器
LR(link register) == R14 特别的寄存器,主程序处理异常时会跳转到子程序,该寄存器保存主程序当前的PC值。或者函数调用时,记录主函数调用子函数后下一个要执行的PC值。

特殊的寄存器

FP(Frame pointer): arguments and locals --->用于访问函数传入的参数
PC(Program counter): jumps and branches --->执行指令的地址
SB(Static base pointer): global symbols --->表示对应symbol的地址
SP(Stack pointer): top of stack --->栈顶地址

常见汇编指令含义

MOVD fn+0(FP), R3 // R3=fn.0 其中FP表示地址fn表示结构体 FP表示该地址数据为fn结构体取该结构体偏移0后的8字节 即
MOVD g_m(g), R4 // R4=g.m g表示地址指向当前正在运行的g g_m表示取g这个结构体中的成员m的值

g结构体的定义

type g struct {
...
m *m
...
}

通过如上方式获取结构体成员的值,和为结构体成员赋值。

函数调用内存分布

网络来源图

该图来源于https://chai2010.cn/advanced-go-programming-book/ch3-asm/ch3-06-func-again.html

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:不争_900c

查看原文:plan9 汇编

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1971 次点击
1 回复 | 直到 2025年05月15日 09:02:51
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏