尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【笔记】golang plan9 汇编中,一个汇编函数调用另一个汇编函数

【笔记】golang plan9 汇编中,一个汇编函数调用另一个汇编函数
📅 发布时间:2026/6/20 23:28:00

【笔记】golang plan9 汇编中,一个汇编函数调用另一个汇编函数

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!

  • cnblogs博客
  • zhihu
  • Github
  • 公众号:一本正经的瞎扯

1. 调试方法

  • 把一个 test 程序编译为二进制
go test \-c \-gcflags="all=-N -l" \-o xxhash.test \github.com/cespare/xxhash/v2
  • 使用 gdb 来调试这个二进制
gdb --args ./xxhash.test \-test.fullpath=true \-test.run=^TestBatch1$
  • 在汇编函数上设置断点
(gdb) break github.com/cespare/xxhash/v2.BatchSum64String
  • 单步调试

    • step
    • s (或者简写为 s)
  • 查看寄存器的值

    • p/x $r8
  • 查看一个指针的内存区域的数据

x/16bx $r8  // 输出 16 字节的内容

2. 一句话总结

一个汇编函数 call 另一个汇编函数,则必然需要栈的空间来存放被调用函数的参数和返回值

// 我的函数
//go:noescape
func BatchSum64String(src []string, dst []uint64) int64// 被调用的函数
//go:noescape
func Sum64(b []byte) uint64

可以发现

  • 主调函数:
    • 参数: src []string, 一共 24 字节
    • 参数:dst []string, 一共 24 字节
    • 参数: int64, 8 字节
  • 被调函数
    • 参数为: []byte,一共 24 字节
    • 返回值为:uint64, 8 字节

因此,需要这样定义函数原型:

// func BatchSum64String(src []string, dst []uint64) int64
// 栈空间 32 字节
// 参数, 56 字节
TEXT ·BatchSum64String(SB), NOSPLIT, $32-56

call 一个函数之前,参数要写到栈上;call 之后,要从栈上取得返回值

    // 把 Data 写到 Sum64 的参数区LEAQ +0(R8)(R11*8), R12MOVQ (R12), R13MOVQ R13, 0(SP)// LenLEAQ +8(R8)(R11*8), R12MOVQ (R12), R13MOVQ R13, 8(SP)MOVQ R13, 16(SP)  // cap// =========================// 2. 调用函数// =========================CALL ·Sum64(SB)// =========================// 3. 取返回值// =========================MOVQ 24(SP), R12
  • 如果有多个参数,则栈布局的顺序是:参数 1, 参数 2...参数 n, 返回值1, 返回值 2... 返回值 n

call 一个函数的时候,不会自动保存寄存器。需要开发者自己维护寄存器。

相关新闻

  • 2025年显微镜公司推荐榜:高清视频显微镜/测量型显微镜/智能识别显微镜/产线自动化智能检测显微镜/生物显微镜厂家核心实力全解析 - 海棠依旧大
  • 2025年防撞与桥梁护栏公司推荐榜:桥面防撞与桥梁护栏/灯光防撞与桥梁护栏/道路防撞与桥梁护栏厂家引领行业安全升级 - 海棠依旧大
  • python基于Web端及微信小程序的会议室预约管理系统设计与实现_1618dule_Pycharm vue flask

最新新闻

  • 2026宁波黄金回收全攻略:十区县正规门店测评+变现避坑指南 - 宁波早知道
  • 2026苏州黄金回收门店横评:姑苏虎丘园区吴中相城五店实测,光谱验金不收损耗费全攻略 - 百福黄金回收
  • MPC5748G到MPC5746C迁移实战:引脚、内存与外设差异全解析
  • 终极小说下载器指南:一键保存100+小说网站,打造个人数字图书馆
  • 太原便宜搬家不踩坑!正规高性价比选太原福康搬家 - 速递信息
  • Diablo Edit2:暗黑破坏神2终极角色编辑器使用指南

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号