首页 > 编程语言 >Go plan9 汇编:手写汇编

Go plan9 汇编:手写汇编

时间:2024-09-01 17:15:30浏览次数:9  
标签:汇编 plan9 go pkg Go SB DATA Id

原创文章,欢迎转载,转载请注明出处,谢谢。


0. 前言

Go plan9 汇编: 打通应用到底层的任督二脉 一文中介绍了从应用程序到汇编指令的转换。本文将结合汇编和 Go 程序实现手写基本的汇编指令,以加深对 Go plan9 汇编的了解。

1. 手写汇编

1.1 全局变量

首先写一个打印整型变量的函数如下:

// ex1/ex1.go
package main

var a = 9527

func main() {
	print(a)
}

使用 go tool compile -S -N -l 输出程序的汇编代码:

# go tool compile -S -N -l ex0.go 
main.main STEXT size=50 args=0x0 locals=0x10 funcid=0x0 align=0x0
    ...
main.a SNOPTRDATA size=8
        0x0000 37 25 00 00 00 00 00 00                          7%......

这里省略了 main.main 的汇编输出,重点关注 main.a 这个变量。输出的 main.a 表示汇编的标识符,SNOPTRDATA 表示这个变量是不包括指针的,这是给垃圾回收器看的,当扫描到这个变量时,垃圾回收器会跳过这个变量的回收。size=8 是这个变量的大小。重点在 0x0000 37 25 00 00 00 00 00 00,这段是 9527 在内存中的排列,0x2537 是 9527 的十六进制表示。

1.1.1 汇编实现全局变量

我们可以写汇编实现全局变量的输出。注意,本文不是汇编的教程,不会过多介绍 Go plan9 汇编的语法内容,关于这方面可以看曹大的 Go 语言高级编程:汇编语言(写的真是太好了!)。

首先,Go plan9 汇编是需要和 Go 文件一起协同工作的。这里

// ex1/ex1.go
package main

import (
	"ex1/pkg"
)

func main() {
	println(pkg.Id)
}

main 包中打印 pkg 包的 Id 变量。

// ex1/pkg/pkg.go
package pkg

var Id int

我们可以写汇编实现 Id 变量的定义,如下:

// ex1/pkg/pkg_amd64.s
#include "textflag.h"

GLOBL ·Id(SB),NOPTR,$8

DATA ·Id+0(SB)/1,$0x37
DATA ·Id+1(SB)/1,$0x25
DATA ·Id+2(SB)/1,$0x00
DATA ·Id+3(SB)/1,$0x00
DATA ·Id+4(SB)/1,$0x00
DATA ·Id+5(SB)/1,$0x00
DATA ·Id+6(SB)/1,$0x00
DATA ·Id+7(SB)/1,$0x00

NOPTR 表示变量 Id 不包括指针,$8 表示变量占 8 个字节。DATA 声明变量存储在内存中的 data 段,内存中的段如下。

image

运行上述程序:

# go run ex1.go
9527

输出变量 9527,其内存分布如下:

image

从变量内存分布可以看出,我们申请的 int(8 字节) 内存,只有 2 个字节是真正被用到的。其它字节都是 0。我们可以节省空间申请 Id 为 2 个字节如下:

// ex1/pkg/pkg.go
package pkg

var Id int16


// ex1/pkg/pkg_amd64.s
#include "textflag.h"

GLOBL ·Id(SB),NOPTR,$8

DATA ·Id+0(SB)/1,$0x37
DATA ·Id+1(SB)/1,$0x25

输出:

# go run ex1.go 
9527

改写 pkg_amd64.s

#include "textflag.h"

GLOBL ·Id(SB),NOPTR,$2

DATA ·Id+0(SB)/1,$0x37
DATA ·Id+1(SB)/1,$0x25
DATA ·Id+2(SB)/1,$0x20

输出:

# go run ex1.go 
9527

0x2537 之上的 1 个字节 0x20 并不会被 CPU 寻址到,CPU 会根据变量声明从内存中读取 2 个字节的 Id 变量送入寄存器中处理。

1.2 字符串

结合 Go 和汇编打印字符串:

// ex2/main.go
package main

import (
	"ex2/pkg"
	"fmt"
)

func main() {
	fmt.Println(pkg.Name)
}

// ex2/pkg/pkg.go
package pkg

var Name string

字符串 Name 的声明在 pkg 包中,使用汇编定义变量 Name

// ex2/pkg/pkg_amd64.s
#include "textflag.h"

GLOBL string<>(SB),NOPTR,$16
DATA string<>+0(SB)/8,$"Hello Wo"
DATA string<>+8(SB)/8,$"rld!"

GLOBL ·Name(SB),NOPTR|RODATA,$16
DATA ·Name+0(SB)/8,$string<>(SB)
DATA ·Name+8(SB)/8,$12

这里字符串变量实际是一个 16 字节的包括长度和指针的结构体。变量定义在:

GLOBL ·Name(SB),NOPTR|RODATA,$16
DATA ·Name+0(SB)/8,$string<>(SB)
DATA ·Name+8(SB)/8,$12

前 8 个字节指向的是存储实际字符串的内存地址,后 8 个字节是字符串的长度。真实的字符串存储在内存中的数据段。这里 string<> 表示该变量 string 时不可导出变量,否则外部 Go 程序可直接访问字符串变量。

画出内存分布图如下:

image

2. 小结

我们顺着上述思路可以继续函数的汇编实现,不过本文重点是了解汇编的写法,不是真正去写汇编。我们通过两个简单的全局变量和字符串的汇编示例,了解汇编代码的写法。在实际应用中几乎不会自己去写,重在了解。更多关于汇编实现的内容可以参考曹大的 Go 高级编程


标签:汇编,plan9,go,pkg,Go,SB,DATA,Id
From: https://www.cnblogs.com/xingzheanan/p/18391474

相关文章

  • 【2025】基于Django的水果商城系统(源码+文档+调试+教程+答疑)
    ......
  • Leangoo领歌Scrum管理工具,轻松实现Scrum敏捷转型
    ​在当今快速变化的商业环境中,企业面临着前所未有的挑战。如何在激烈的竞争中保持领先?如何快速响应市场需求?答案就在于敏捷转型。而在这一过程中,有一个高效的敏捷工具至关重要——Leangoo领歌(Leangoo领歌-免费一站式敏捷研发协同平台,Scrum工具,SAFe敏捷工具,敏捷项目管理)就是......
  • 基于django+vue+uniapp的摄影竞赛小程序
    开发语言:Python框架:django+uniappPython版本:python3.7.7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:PyCharm系统展示管理员登录管理员主界面教师管理学生管理辅导员管理项目信息管理作品信息管理留言板管理轮播图管理用户登录界面系统首页......
  • 使用Golang的协程竟然变慢了|100万个协程的归并排序耗时分析
    前言这篇文章将用三个版本的归并排序,为大家分析使用协程排序的时间开销(被排序的切片长度由128到1000w)本期demo地址:https://github.com/BaiZe1998/go-learning往期视频讲解......
  • 基于django+vue新起点球馆预约【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着体育健身意识的普及与提升,运动场馆成为了人们日常生活中不可或缺的一部分。然而,传统球馆管理往往面临着预约效率低下、信息不对称、资......
  • 基于django+vue新能源汽车租赁平台的设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球对环境保护意识的增强及能源结构的转型,新能源汽车作为绿色出行的代表,正逐步成为汽车工业发展的新趋势。然而,高昂的购车成本及充电......
  • 基于django+vue新生报到系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育规模的持续扩大,每年新生入学的数量显著增加,传统的人工新生报到流程已难以满足高效、便捷的管理需求。从填写繁琐的纸质表格到......
  • 基于django+vue新能源汽车租赁管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球对环境保护意识的增强及能源结构的转型升级,新能源汽车作为绿色出行的重要载体,其普及与应用已成为推动可持续发展的重要途径。然而......
  • 基于django+vue新疆IP形象NFT藏品网站【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着区块链技术的飞速发展,非同质化代币(NFT)作为数字资产的新兴形式,正逐步改变着艺术、收藏及文化产业的格局。新疆,作为中国多元文化的瑰宝......
  • 基于django+vue新冠肺炎病人治疗跟踪管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球新冠疫情的持续蔓延,医疗系统面临着前所未有的挑战。新冠肺炎病人的治疗与管理成为公共卫生领域的重中之重。传统的医疗管理模式在......