[译] Golang 汇编器快速指南

龙芯Go!Go!Go!——龙芯平台上构建Go语言环境指南 一、初识Go语言 Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Griesemer、Ken Thompson和Rob Pike等世界顶尖计算科学家精心打造的系统编程语言。Go语言最显著的特点是编码简洁迅速、支持高效并发和自动内存管理等。此外,Go语言还面向网络服务器、存储系统和数据库等领域的编程进行了优化设计,并且简化了应用系统的安装和部署。因此,Go语言受到了广大程序员的青睐,越来越多地开始应用于谷歌和百度等知名中外企业的产品中。 Go语言形象标识 对于这样一个在云 阅读详情

本文档是 Go编译器 GC 使用的非通用形式的汇编语言快速大纲。文档并不完整。

汇编器基于 Plan 9 汇编器的输入风格。详细文档在这里。如果你准备写一些汇编语言,那么虽然此文档是基于 Plan 9 的,你也应该通读。本文提供了语法摘要和与其解释内容的区别,并且描述了编写汇编与 Go 交互时所适用的特性。

最重要的是,Go 的汇编器并不是底层的直接表示。有一些是直接的映射,有一些不是。这是因为编译套件在常规流程中并不需要汇编器。相反,编译器针对一种半抽象的指令集操作,而且指令选择发生在一部分发生在代码生成之后。汇编器工作在半抽象状态下,所以当你看到类似指令 MOV,工具链实际生成的操作也许并不是移动,而是清除指令或者加载指令。或者也可能与实际指令完全对应。一般来说,特定机器的操作倾向于它们自身,而更通用的概念(如内存移动、子程序调用、返回等)则更加抽象。细节根据体系架构会有不同,我们非常抱歉关于这种不精确,情况还没有完全定义。

汇编器程序是一种解析半抽象指令集的描述并将其转换为输入给链接器指令的方法。如果想要看到给定体系的汇编指令(如:amd64),在标准库源码中有很多实例(比如 runtime math/big)。你可以测试编译器生成的汇编代码(实际输出可能和这里有出入):

$ cat x.go
package main

func main() {
    println(3)
}
$ GOOS=linux GOARCH=amd64 go tool compile -S x.go        # or: go build -gcflags -S x.go
"".main STEXT size=74 args=0x0 locals=0x10
    0x0000 00000 (x.go:3)   TEXT    "".main(SB), $16-0
    0x0000 00000 (x.go:3)   MOVQ    (TLS), CX
    0x0009 00009 (x.go:3)   CMPQ    SP, 16(CX)
    0x000d 00013 (x.go:3)   JLS 67
    0x000f 00015 (x.go:3)   SUBQ    $16, SP
    0x0013 00019 (x.go:3)   MOVQ    BP, 8(SP)
    0x0018 00024 (x.go:3)   LEAQ    8(SP), BP
    0x001d 00029 (x.go:3)   FUNCDATA    $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x001d 00029 (x.go:3)   FUNCDATA    $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x001d 00029 (x.go:3)   FUNCDATA    $2, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    0x001d 00029 (x.go:4)   PCDATA  $0, $0
    0x001d 00029 (x.go:4)   PCDATA  $1, $0
    0x001d 00029 (x.go:4)   CALL    runtime.printlock(SB)
    0x0022 00034 (x.go:4)   MOVQ    $3, (SP)
    0x002a 00042 (x.go:4)   CALL    runtime.printint(SB)
    0x002f 00047 (x.go:4)   CALL    runtime.printnl(SB)
    0x0034 00052 (x.go:4)   CALL    runtime.printunlock(SB)
    0x0039 00057 (x.go:5)   MOVQ    8(SP), BP
    0x003e 00062 (x.go:5)   ADDQ    $16, SP
    0x0042 00066 (x.go:5)   RET
    0x0043 00067 (x.go:5)   NOP
    0x0043 00067 (x.go:3)   PCDATA  $1, $-1
    0x0043 00067 (x.go:3)   PCDATA  $0, $-1
    0x0043 00067 (x.go:3)   CALL    runtime.morestack_noctxt(SB)
    0x0048 00072 (x.go:3)   JMP 0
...
复制代码

FUNCDATA 和 PCDATA 包含了垃圾回收使用的信息,会在编译器中介绍。

想要查看链接后放入二进制文件中的内容,使用 go tool objdump 来查看:

$ go build -o x.exe x.go
$ go tool objdump -s main.main x.exe
TEXT main.main(SB) /tmp/x.go
  x.go:3        0x10501c0       65488b0c2530000000  MOVQ GS:0x30, CX
  x.go:3        0x10501c9       483b6110        CMPQ 0x10(CX), SP
  x.go:3        0x10501cd       7634            JBE 0x1050203
  x.go:3        0x10501cf       4883ec10        SUBQ $0x10, SP
  x.go:3        0x10501d3       48896c2408      MOVQ BP, 0x8(SP)
  x.go:3        0x10501d8       488d6c2408      LEAQ 0x8(SP), BP
  x.go:4        0x10501dd       e86e45fdff      CALL runtime.printlock(SB)
  x.go:4        0x10501e2       48c7042403000000    MOVQ $0x3, 0(SP)
  x.go:4        0x10501ea       e8e14cfdff      CALL runtime.printint(SB)
  x.go:4        0x10501ef       e8ec47fdff      CALL runtime.printnl(SB)
  x.go:4        0x10501f4       e8d745fdff      CALL runtime.printunlock(SB)
  x.go:5        0x10501f9       488b6c2408      MOVQ 0x8(SP), BP
  x.go:5        0x10501fe       4883c410        ADDQ $0x10, SP
  x.go:5        0x1050202       c3          RET
  x.go:3        0x1050203       e83882ffff      CALL runtime.morestack_noctxt(SB)
  x.go:3        0x1050208       ebb6            JMP main.main(SB)
复制代码

常量

尽管汇编器遵循 Plan 9 的规范,但这是一个独立程序,会有一些不同。其中一个就是常量评估。汇编器中的常量表达式是按照 Go 的操作符优先级来解析的,而不是类 C 的优先级。所以, 3&1<<2 是 4 而不是 0。它按照 (3&1)<<2 来解析,而不是 3&(1<<2)。而且,常量会被解析为 64位无符号整形。所以 -2 不是整形数减2,而是具有同样位信息

龙芯平台构建Go语言环境指南 http://www.loongson.cn/news/company/456.html 一、初识Go语言         Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Griesemer、Ken Thompson和Rob Pike等世界顶尖计算科学家精心打造的系统编程语言。Go语言最显著的特点是编码简洁迅速、支持高效并发和自动内存管理等。此外,Go语言还... 阅读详情

相关推荐

golang-asm:来自Go编译器的汇编器,采用库形式

golang-asm Go编译器的汇编器镜像,其中导入路径被重写,以使汇编器可用作独立的库。 按照Go项目的许可。 地位 工作,但希望挖掘到汇编godoc是制定出什么来设置不同的参数obj.Prog得到它产生的具体说明。 例子 演示在x86-64上汇编NOP和ADD指令。 package main import ( "fmt" asm "github.com/twitchyliquid64/golang-asm" "github.com/twitchyliquid64/golang-asm/obj" "github.com/twitchyliquid64/golang-asm/obj/x86" ) func noop ( builder * asm. Builder ) * obj. Prog { prog := builder . NewProg () prog .

ClaudeCode 通过 CC Switch 配置 Ollama 本地大模型

本文介绍了如何让Claude Code使用本地免费模型qwen3.5:9b而无需Anthropic API Key的方法。主要内容包括:1)安装Claude Code、CC Switch代理工具和Ollama本地模型运行时;2)配置环境变量和设置文件将请求转发到本地服务;3)详细说明了系统架构和工作原理,展示请求如何从Claude Code经CC Switch代理到Ollama本地模型。该方案通过代理拦截和转发机制,实现了使用免费开源模型替代官方API的功能。

稚枭天卓 3221

STM32_WS2811驱动

STM32的WS2811驱动

健身房 2840

浏览器主页被360篡改?教你彻底解决并预防再次发生

通过本文介绍的快捷方式修复、注册表清理、启动项管理三步法,可解决99%的浏览器主页篡改问题。权限最小化原则:非管理员账户日常使用,关键系统目录设置写保护定期安全审计:每月检查启动项/计划任务/浏览器扩展备份还原机制:创建系统还原点,重要操作前做好快照安全意识培养:不安装来源不明的软件,谨慎处理软件安装向导中的附加选项浏览器安全是系统防护的重要环节,建议结合EDR(终端检测与响应)方案构建立体防护体系。对于普通用户,保持系统更新、使用官方渠道下载软件、定期清理系统垃圾,即可有效预防绝大多数安全威胁。

nntxthml的博客 1万+

Fluent UDF实战:除了速度入口,你的DEFINE_PROFILE宏还能搞定这些边界条件(温度、组分、壁面接触角全解析)

本文深入解析Fluent UDF中DEFINE_PROFILE宏在复杂边界条件中的高阶应用,涵盖温度场、组分浓度和壁面接触角等关键场景。通过实战代码示例,展示如何实现空间梯度温度场、动态组分控制和接触角动态调整,助力CFD工程师突破标准界面限制,提升仿真精度和效率。

weixin_28688385的博客 450

保姆级教程:手把手配置MAX9295/9296 GMSL2-CSI2链路,搞定4LAN/1LAN模式与常见调试

本文提供MAX9295/9296 GMSL2-CSI2链路的详细配置教程,涵盖4LAN和1LAN模式的硬件连接、寄存器配置及调试技巧。通过实战案例和代码示例,帮助开发者快速实现高带宽视频传输,解决常见问题如信号同步和功耗优化,适用于车载摄像头和机器人视觉系统开发。

weixin_42561143的博客 434

推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展

推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。

丨汀、的博客 7591

SAP_ABAP_SD_BAPI清单案例教程——销售订单开票_BAPI_BILLINGDOC_CREATEMULTIPLE_VF01_S4版本

SAP BAPI(Business Application Programming Interface)是SAP系统中的一组规范和标准,用于从SAP系统中获取数据、输入数据和更新数据。这些API允许开发者以编程方式与SAP系统交互,而无需编写大量的自定义代码。2.1 Copy代码 直接可使用。2.2 VF01开票。

java_zhong1990的专栏 2214

045、镜头模组公差链分析:从 Lens 到 Sensor 的装配公差累积与良率优化

本文深入分析了镜头模组从镜片到传感器各环节的公差累积问题及优化策略。文章首先剖析了四级公差链(镜片单体、镜筒装配、VCM定位、传感器贴装)的误差传递机制,指出各环节典型公差值及其影响(如5微米镜片偏差可导致0.02度光线偏折)。其次对比了最坏情况法与均方根法的差异,强调需考虑公差相关性(如镜片曲率与镜筒间隙的正相关性)。最后提出良率优化"三板斧":通过蒙特卡洛仿真优化公差分配、采用主动对准工艺在线补偿、建立数据反馈闭环系统,并结合"阴阳脸"案例说明如何定位根因(模具磨损+贴片机老化导致的误差叠加)。作者总结

sundong_81的博客 59

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 啃透这本SpringBoot核心知识点,金九银十还怕干不赢面试官?
下一篇: Alibaba内部出品JavaEE开发手册( MVC+ Spring+MyBatis )和Redis实现
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值