首页 > 编程语言 >Go字符串及字符串拼接的反汇编代码解读

Go字符串及字符串拼接的反汇编代码解读

时间:2024-05-26 15:00:09浏览次数:12  
标签:runtime SP Go 反汇编 go 字符串 SB main

Go字符串及字符串拼接的反汇编代码解读

源代码

package main

func main() {
    s := "hello world"
    s += " go\n"
    print(s)
}

Go版本

jagitch@34c4dd4d4a3e:str-demo$ go version
go version go1.22.2 linux/amd64

运行

jagitch@34c4dd4d4a3e:str-demo$ go run main.go
hello world go

编译

jagitch@34c4dd4d4a3e:str-demo$ go build main.go

反汇编

jagitch@34c4dd4d4a3e:str-demo$ go tool objdump -S -s '^main.main' main
TEXT main.main(SB) /home/coder/workspace/own/jagitch-code/gitee/go-study/go-asm/str-demo/main.go
func main() {
  0x45d120              493b6610                CMPQ SP, 0x10(R14)
  0x45d124              7650                    JBE 0x45d176
  0x45d126              55                      PUSHQ BP
  0x45d127              4889e5                  MOVQ SP, BP
  0x45d12a              4883ec38                SUBQ $0x38, SP
        s += " go\n"
  0x45d12e              31c0                    XORL AX, AX
  0x45d130              488d1d15140100          LEAQ 0x11415(IP), BX
  0x45d137              b90b000000              MOVL $0xb, CX
  0x45d13c              488d3da70a0100          LEAQ 0x10aa7(IP), DI
  0x45d143              be04000000              MOVL $0x4, SI
  0x45d148              e813c7feff              CALL runtime.concatstring2(SB)
  0x45d14d              4889442430              MOVQ AX, 0x30(SP)
  0x45d152              48895c2428              MOVQ BX, 0x28(SP)
        print(s)
  0x45d157              e8e436fdff              CALL runtime.printlock(SB)
  0x45d15c              488b442430              MOVQ 0x30(SP), AX
  0x45d161              488b5c2428              MOVQ 0x28(SP), BX
  0x45d166              e8553ffdff              CALL runtime.printstring(SB)
  0x45d16b              e83037fdff              CALL runtime.printunlock(SB)
}
  0x45d170              4883c438                ADDQ $0x38, SP
  0x45d174              5d                      POPQ BP
  0x45d175              c3                      RET
func main() {
  0x45d176              e885cdffff              CALL runtime.morestack_noctxt.abi0(SB)
  0x45d17b              eba3                    JMP main.main(SB)

解析

  1. CMPQ SP, 0x10(R14) SP减去0x10(R14)的值
  2. JBE 0x45d176 如果上一步的结果小于等于,则跳转到0x45d176处
  3. PUSHQ BP 压入上一个函数的栈帧基址
  4. MOVQ SP, BP 将当前栈顶保存到BP寄存器
  5. SUBQ $0x38, SP SP减去0x38,分配0x38个字节的栈空间
  6. XORL AX, AX 清空AX
  7. LEAQ 0x11415(IP), BX 将"hello world"字符串常量的地址加载到BX
  8. MOVL $0xb, CX 将"hello world"字符串的长度加载到CX
  9. LEAQ 0x10aa7(IP), DI 将" go\n"字符串的地址加载到DI
  10. MOVL $0x4, SI 将" go\n"的长度加载到SI
  11. CALL runtime.concatstring2(SB) 调用concatstring2函数拼接字符串
  12. MOVQ AX, 0x30(SP) AX是concatstring2的第一个返回值,是拼接后的字符串的地址,将其保存到0x30(SP)
  13. MOVQ BX, 0x28(SP) BX是第二个返回值,是拼接后的字符串的长度,保存到0x28(SP)
  14. CALL runtime.printlock(SB) 打印加锁
  15. MOVQ 0x30(SP), AX 将字符串的地址加载到AX
  16. MOVQ 0x28(SP), BX 将字符串的长度加载到BX
  17. CALL runtime.printstring(SB) 打印字符串
  18. CALL runtime.printunlock(SB) 解锁打印
  19. ADDQ $0x38, SP SP加上0x38,回收之前分配的栈空间
  20. POPQ BP 弹出上个函数的BP
  21. RET 返回
  22. CALL runtime.morestack_noctxt.abi0(SB) 增加栈空间
  23. JMP main.main(SB) 跳转到main包的main函数

结论

  1. 字符串常量会保存到一块内存中,使用0x11415(IP)等方式可以找到它的地址

  2. 字符串拼接会调用runtime.concatstring2函数进行拼接

推荐阅读

1. 使用VS Code调试Go程序
2. 使用树梅派搭建Golang、Python、NodeJs的开发服务器
3. Go语言中局部变量的逃逸分析(从汇编的角度)

标签:runtime,SP,Go,反汇编,go,字符串,SB,main
From: https://blog.csdn.net/fuxily/article/details/139214791

相关文章

  • 小猴编程周赛C++ | 字符串价值
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】一个字符串的价值定义为:该字符串所有字母价值之和,一个字母如果在字符串中是第一次出现,则该字母的价值为2,否则价值为1,并且......
  • KPM算法求字符串的最小周期证明
    先给出公式ans=n-LPS[n-1]其中ans为最小周期,n为给出的由假设的周期字符串中提取出的子串长度,LPS为前缀函数,n-1为字符串最后的位置下标证明如下证明ans=n-LPS[n-1],思路:(1)证明特殊情况,即先对完整周期字符串进行证明,这时候的字符串组成是[1][2][3][4],即4个......
  • 使用树梅派搭建Golang、Python、NodeJs的开发服务器
    使用树梅派搭建Golang、Python、NodeJs的开发服务器安装系统安装rpi-imagersudoaptinstallrpi-imager打开rpi-imager烧写RaspberryPiOSLite(64-bit)系统设置好用户名、密码、wifi、ssh等信息上电修改镜像源备份/etc/apt/sources.listsudocp/etc/apt......
  • 从零开始学习 Python 3 - 玩转字符串 2:字符串格式化高阶玩法
    玩转字符串2:字符串格式化高阶玩法前言回顾:字符串格式化的三种方式高阶玩法:让你的字符串格式化更上一层楼1.格式规格迷你语言:精细控制输出格式2.自定义格式化:`__format__()`魔法方法3.格式化字符串字面值:`f"..."`的灵活运用总结公众号:人生只不过是一场投资温......
  • Django和MySQL与Vue项目之间的数据是如何流动实现交互响应的
    在一个前后端分离的Django和Vue项目中,Django作为后端,MySQL作为数据库,Vue作为前端,数据的流动和交互可以通过API来实现。以下是数据流动的过程及交互的详细说明:1.数据流动过程概述前端发送请求:Vue应用通过HTTP请求向Django后端发送数据请求(例如获取、创建、更新或删除数据)。后......
  • Django上传图片实操不会上传图片的拿走
    上传图片当Django在处理文件上传的时候,文件数据被保存在request.FILESFILES中的每个键为<inputtype="file"name=""/>中的name注意:FILES只有在请求的方法为POST且提交的<form>带有enctype="multipart/form-data"的情况下才会包含数据。否则,FILES将为一个空的类似于字典的......
  • Django分页操作实例
    分页操作Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中Paginator对象Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数属性count:对象总数num_pages:页面总数page_range:页码列表,从1开始,例如[1,2,3,4]方法page(num):下标以1开始......
  • 视差背景,GODOT游戏引擎学习笔记(五)
    背景图片资源今天周六玩了一天,现在晚上来更新一下帖子。前面几节我们学习了创建一个人物精灵节点使其移动。这节我们来学习创建背景。会用到三个图片文件。我已经上传到csdn了,链接如下:https://download.csdn.net/download/weixin_66990397/89356894?spm=1001.2014.3001.5501......
  • 开坑开坑,GODOT游戏引擎学习笔记(一)
    前言         本人重度游戏玩家,计科专业学生,玩了许多游戏已经逐渐电子羊尾,于是打算学习几个游戏引擎,一个方面是爱好,另一方面也是多掌握点技术。先打算从2D游戏开始学,目前引擎确定为GODOT,一个开源且适合新手的引擎。后续学习unity和虚幻等引擎也会继续更新,同时也会开......
  • C - Bingo 2
    C-Bingo2https://atcoder.jp/contests/abc355/tasks/abc355_c 思路统计每行元素个数统计每列元素个数统计两个对角线的元素个数任意一个达到n,则满足条件 Codehttps://atcoder.jp/contests/abc355/submissions/53878562#defineintlonglongintn,t;vector<i......