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


因为只是玩一玩,所以走的路线是:用C写代码,把C编译成AT&T格式汇编,把AT&T格式转换成plan9格式,在golang中调用plan9汇编。

c代码

函数

在clib/c/add.c中:

int add(int a, int b){  //实现一个两个整形相加的简单函数
return a + b;
}

编译

用clang编译C代码。注意:一定要用clang,且一定要用x86的处理器,苹果的M1不行。

clang -mno-red-zone -fno-asynchronous-unwind-tables -fno-builtin -fno-exceptions \
-fno-rtti -fno-stack-protector -nostdlib -O3 -msse4 -mavx -mno-avx2 -DUSE_AVX=1 \
-DUSE_AVX2=0 -S add.c -o add.s

删除不必要的内容

add.s的内容为:

	.text
.file "add.c"
.globl add # -- Begin function add
.p2align 4, 0x90
.type add,@function
add: # @add
# %bb.0:
# kill: def $esi killed $esi def $rsi
# kill: def $edi killed $edi def $rdi
leal (%rdi,%rsi), %eax
retq
.Lfunc_end0:
.size add, .Lfunc_end0-add
# -- End function
.ident "clang version 10.0.1"
.section ".note.GNU-stack","",@progbits
.addrsig

我们只需要add函数,因此删除add函数以外的代码:

add:                                    # @add
# %bb.0:
# kill: def $esi killed $esi def $rsi
# kill: def $edi killed $edi def $rdi
leal (%rdi,%rsi), %eax
retq

转换为plan9汇编

安装工具

这个工具可以把AT&T汇编转换成plan9汇编:https://github.com/chenzhuoyu/asm2asm

  1. 要安装python3.8版本,低于这个版本无法使用
  2. 安装依赖的库:
pip install --upgrade git+https://github.com/Maratyszcza/PeachPy
  1. python脚本的使用方法为:python3 asm2asm.py 目的路径/add.s 源路径/add.s

准备go函数的定义文件

在 clib/add.go 中写入:

package clib

//go:nosplit
//go:noescape
//goland:noinspection GoUnusedParameter
func _add(a int, b int) (ret int)

为了便于导出这个函数,还可以增加导出的文件: clib/export.go

package clib

func AddInt(a int, b int) int {
return _add(a, b)
}

执行转换

cd clib/c
python3 asm2asm.py ../add.s add.s

然后在 clib 目录生成了文件:add.s add_subr.go

调用

在上层目录建立文件go.mod:

module github.com/ahfuzhang/example

go 1.18

入口文件:main.go

package main

import (
"fmt" "github.com/ahfuzhang/example/clib"
) func main() {
fmt.Println(clib.AddInt(1, 2))
}

整体目录结构为:

example
clib
add.s
add.go
add_subr.go
export.go
c
add.c
add.s
main.go
go.mod

运行:

go run main.go

结果为3,成功了!

have fun!

玩一玩golang汇编的更多相关文章

  1. 为什么说程序员都应该玩一玩GitHub

    既熟悉又陌生的GitHub 关于GitHub,相信每一个程序员都再熟悉不过了.它为开发者提供Git仓库的托管服务,是全世界最大的代码集中地,被戏称为“全球最大同性交友网站”. 但是对于很大一部分程序员 ...

  2. [golang]golang 汇编

    https://lrita.github.io/2017/12/12/golang-asm/#why 在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于 ...

  3. Golang 汇编asm语言基础学习

    Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...

  4. 玩一玩nodejs--一个简单的在线实时填表应用

    学习nodejs三天,入了个门,感觉他和jsp.php还是存在较大的差别.本文首先复习这些天学的一些知识点,然后谈一下如何一步一步到做一个在线实时填表的小应用,进一步巩固一下这些个知识点.这里先简单介 ...

  5. 一起玩转玩转LiteOS组件:TinyFrame

    摘要:TinyFrame是一个简单的用于解析串口(如 UART.telnet.套接字等)通信数据帧的库. 本文分享自华为云社区<LiteOS组件尝鲜-玩转TinyFrame>,作者:Lio ...

  6. 无语啊,sublime给我弄乱玩,玩坏了,而且安装插件也安装不了

    国内的什么插件地址都TMMD失效了,没办法,只能翻"强"到外面找了,而且找了很多也用不了,所以收藏一个为了预防以后不行有补救的方法: 百度的99%都不行,不是报这个错就是那个错,可 ...

  7. 想挑战AlphaGO吗?先和PostgreSQL玩一玩?? PostgreSQL与人工智能(AI)

    1月4日晚,随着古力认输,Master对人类顶尖高手的战绩停留在60胜0负1和,而令人尴尬的是这唯一一场和棋还是因为棋手掉线系统自动判和,并不是棋盘上的局势真的势均力敌了.包括聂卫平.柯洁.朴廷桓.井 ...

  8. js 玩一玩

    闲着没事学了学js,做了一个下页面玩玩. 下面是html代码: <!DOCTYPE html><html> <head> <meta charset=&quo ...

  9. 玩一玩基于Token的 自定义身份认证+权限管理

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...

  10. .NET Core 玩一玩 Ocelot API网关

    .net 这几年国内确实不好过. 很多都选择转行.不过.net Core跨平台 开源之后 .社区的生态在慢慢建立.往好的趋势发展. 对于坚守在.NET战线的开发者来说 是个挺不错的消息.  特别是微软 ...

随机推荐

  1. 云图说|玩转华为HiLens之端云协同AI开发

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 华为HiLens ...

  2. 使用Plist编辑器——简单入门指南

      本指南将介绍如何使用Plist编辑器.您将学习如何打开.编辑和保存plist文件,并了解plist文件的基本结构和用途.跟随这个简单的入门指南,您将掌握如何使用Plist编辑器轻松管理您的plis ...

  3. 火山引擎DataTester:无需研发人力,即刻开启企业A/B实验

    近日,火山引擎A/B测试平台-- DataTester 对产品内A/B实验的"可视化编辑器"进行了新的升级,对交互.预览.Xpath的层次结构视图等能力均做了优化.   据介绍,火 ...

  4. Axure 多人协作

    创建团队项目 团队 => 从当前文件创建团队项目 签出的文件才能被修改 签出 签入 发布评论 邀请 编辑的5种状态 和SVN差不多的概念 已有项目导入 https://www.bilibili. ...

  5. 飞书接入ChatGPT

    飞书接入ChatGPT 前天我用飞书接入了GPT-3,现在终于可以在国内畅通地聊天了. 上面是群聊截图,下面是私聊截图 其实实现过程极其简单,但是我和好兄弟确实绕了不少弯路. 首先提醒: 1 不适合个 ...

  6. C# .NET Socket SocketHelper 高性能 5000客户端 异步接收数据

    网上有很多Socket框架,但是我想,C#既然有Socket类,难道不是给人用的吗? 写了一个SocketServerHelper和SocketClientHelper,分别只有5.6百行代码,比不上 ...

  7. 同步时间,为什么我选 Chrony 而不是 NTP ?

    初识 chrony chrony 是网络时间协议(Network Time Protocol )的通用实现 它不但可以提供保持系统时间与 NTP 时钟服务器同步的服务,还能作为 NTP 服务器对其他服 ...

  8. 深入剖析 RSA 密钥原理及实践

    一.前言 在经历了人生的很多至暗时刻后,你读到了这篇文章,你会后悔甚至愤怒:为什么你没有早点写出这篇文章?! 你的至暗时刻包括: 1.你所在的项目需要对接银行,对方需要你提供一个加密证书.你手上只有一 ...

  9. 使用aop去自定义注解,实现用户在请求的时候记录下来,如日志功能等

    首先搞清楚aop的几个概念: AOP即是面向切面,是Spring的核心功能之一,主要的目的即是针对业务处理过程中的横向拓展,以达到低耦合的效果. 「切面(Aspect)」:一个关注点的模块化.以注解@ ...

  10. 你想怎么使用 Serverless 函数计算?(评测赢好礼 )

    随着云计算发展,云原生热度攀升,Serverless 架构崭露头角且发展势头迅猛.不仅被更多开发者所关注,市场占有率也逐年提高.阿里云函数计算(Function Compute)是一个事件驱动的全托管 ...