作者:张富春(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. LSP 网络劫持(Layered Service Provider Hijacking)

    LSP 简介: 分层服务提供商(Layered Service Provider,LSP)是一种可以扩展Winsock作为应用程序的 Windows 的网络套接字工具的机制.Winsock LSP 可 ...

  2. 【Redis】面试题 GEO地理位置信息

    目录 面试 1 http协议详情,http协议版本,http一些请求头 2 GET请求和POST请求的区别 3 如何实现服务器给客户端发送消息,websocket是什么? 4 悲观锁和乐观锁,如何实现 ...

  3. Eight HDU - 1043 (反向搜索 + 康拓展开 / A* + BFS / IDA* )

    题目描述 简单介绍一下八数码问题: 在一个3×3的九宫格上,填有1~8八个数字,空余一个位置,例如下图: 1 2 3 4 5 6 7 8 在上图中,由于右下角位置是空的,你可以移动数字,比如可以将数字 ...

  4. Qt开发-共享内存使用范例,配合开发者密钥使用后台调试程序或者进入调试模式

    共享内存 就之前不是开发了一个Leventure_DeveloperKey用以调试程序嘛,在这里简单聊一下调试模式的方案. 这里的调试分为了两种,一种是调试模式,一种是开发者模式.需要这两种模式的原因 ...

  5. shell脚本(4)-格式化输入

    一.read命令 1.概念: 默认接受键盘的输入,回车符代表输入结束 2.read命令选项 -p:打印信息 -t:限定时间 -s:不回显 -n:输入字符个数 3.举例说明 (1)模拟登录 [root@ ...

  6. jQuery组织后续事件 事件冒泡 事件委托 键被按下 批量操作 hover input 事件

    1. jQuery绑定事件的方式 1. $('').click(function(){}) 2. $('').on('click', function(){}) 2. 阻止后续事件执行 1. retu ...

  7. mysql 复制表结构创建表及复制表结构与数据创建表

    本文为博主原创,未经允许不得转载: 在开发过程或项目维护发布过程中,经常需要复制建表及复制表数据建表等,整理了以下四种常用的 mysql 命令. 1.  create like 复制表结构(包含索引, ...

  8. Shell-全局变量-export

  9. [转帖]聊聊redis的slowlog与latency monitor

    https://www.jianshu.com/p/95a9ce63ddb2 序 本文主要研究一下redis的slowlog与latency monitor slowlog redis在2.2.12版 ...

  10. [转帖]Kubernetes 1.23:IPv4/IPv6 双协议栈网络达到 GA

    https://kubernetes.io/zh-cn/blog/2021/12/08/dual-stack-networking-ga/#:~:text=Kubernetes%201.23%EF%B ...