玩一玩golang汇编
作者:张富春(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
- 要安装python3.8版本,低于这个版本无法使用
- 安装依赖的库:
pip install --upgrade git+https://github.com/Maratyszcza/PeachPy
- 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汇编的更多相关文章
- 为什么说程序员都应该玩一玩GitHub
既熟悉又陌生的GitHub 关于GitHub,相信每一个程序员都再熟悉不过了.它为开发者提供Git仓库的托管服务,是全世界最大的代码集中地,被戏称为“全球最大同性交友网站”. 但是对于很大一部分程序员 ...
- [golang]golang 汇编
https://lrita.github.io/2017/12/12/golang-asm/#why 在某些场景下,我们需要进行一些特殊优化,因此我们可能需要用到golang汇编,golang汇编源于 ...
- Golang 汇编asm语言基础学习
Golang 汇编asm语言基础学习 一.CPU 基础知识 cpu 内部结构 cpu 内部主要是由寄存器.控制器.运算器和时钟四个部分组成. 寄存器:用来暂时存放指令.数据等对象.它是一个更快的内存. ...
- 玩一玩nodejs--一个简单的在线实时填表应用
学习nodejs三天,入了个门,感觉他和jsp.php还是存在较大的差别.本文首先复习这些天学的一些知识点,然后谈一下如何一步一步到做一个在线实时填表的小应用,进一步巩固一下这些个知识点.这里先简单介 ...
- 一起玩转玩转LiteOS组件:TinyFrame
摘要:TinyFrame是一个简单的用于解析串口(如 UART.telnet.套接字等)通信数据帧的库. 本文分享自华为云社区<LiteOS组件尝鲜-玩转TinyFrame>,作者:Lio ...
- 无语啊,sublime给我弄乱玩,玩坏了,而且安装插件也安装不了
国内的什么插件地址都TMMD失效了,没办法,只能翻"强"到外面找了,而且找了很多也用不了,所以收藏一个为了预防以后不行有补救的方法: 百度的99%都不行,不是报这个错就是那个错,可 ...
- 想挑战AlphaGO吗?先和PostgreSQL玩一玩?? PostgreSQL与人工智能(AI)
1月4日晚,随着古力认输,Master对人类顶尖高手的战绩停留在60胜0负1和,而令人尴尬的是这唯一一场和棋还是因为棋手掉线系统自动判和,并不是棋盘上的局势真的势均力敌了.包括聂卫平.柯洁.朴廷桓.井 ...
- js 玩一玩
闲着没事学了学js,做了一个下页面玩玩. 下面是html代码: <!DOCTYPE html><html> <head> <meta charset=&quo ...
- 玩一玩基于Token的 自定义身份认证+权限管理
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...
- .NET Core 玩一玩 Ocelot API网关
.net 这几年国内确实不好过. 很多都选择转行.不过.net Core跨平台 开源之后 .社区的生态在慢慢建立.往好的趋势发展. 对于坚守在.NET战线的开发者来说 是个挺不错的消息. 特别是微软 ...
随机推荐
- Axure 页面交互
- SQL Server 附加数据库,报只读文件,无权修改其中某些文件
MSSQL 默认安装在 C盘下,由于C盘没空间了,迁到D盘,这时候在附件数据库是报了错误:附加数据库 因为它是只读的,它具有只读文件,无权修改其中某些文件 如果是可以附加,显示(只读)这时候不能删除 ...
- 【已解决】无法打开.xlsx文件,xlrd.biffh.XLRDError: Excel xlsx file; not supported
原因是最近xlrd更新到了2.0.1版本,只支持.xls文件.所以x1 = xlrd.open_workbook("data.xlsx")会报错. 可以安装旧版xlrd,在cmd中 ...
- redis之列表 redis之hash redis其他操作 redis管道 django中使用redis celery介绍和安装 celery快速使用 celery包结构
目录 昨日回顾 今日内容 1 redis之列表 2 redis之hash 3 redis其他操作 4 redis 管道 5 django中使用redis 6 celery介绍和安装 7 celery快 ...
- 将nginx交给service管理
#!/bin/bash # chkconfig: 2345 99 99 prot=80 nginx=/usr/local/nginx/sbin/nginx check(){ ! $nginx -tq ...
- vivo 大规模特征存储实践
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/u1LrIBtY6wNVE9lzvKXWjA作者:黄伟锋 本文旨在介绍 vivo 内部的特征存储 ...
- iOS Class Guard github用法、工作原理和安装详解及使用经验总结
iOS Class Guard github用法.工作原理和安装详解及使用经验总结 iOS Class Guard是一个用于OC类.协议.属性和方法名混淆的命令行工具.它是class-dump的扩展 ...
- ttf转eot
Webfont Generator https://www.fontsquirrel.com/tools/webfont-generator 使用@font-face显示web自定义字体,字体获取工具 ...
- vue-cli3title标签中的htmlWebpackPlugin.options.title
https://blog.csdn.net/weixin_56650035/article/details/119355625
- java基础-构建工具mvn-day20
目录 1. 初识mvn 2. 用maven创建工程 3. maven工程 之间的关系 4. 父子 mvn工程 5. mvn常见的插件 6. tomcat插件 1. 初识mvn mvn是一个项目构建工具 ...
