玩一玩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战线的开发者来说 是个挺不错的消息. 特别是微软 ...
随机推荐
- pyshorteners 长短链接转换
import requests import pyshorteners as psn def long_to_short(url): url = psn.Shortener().chilpit.sho ...
- 【3rd Party】Cpp 中使用 Protobuf
前置条件: [Protoc]VS2019 (VS平台) 使用 CMake 编译安装.使用 Protobuf 库 [ToolChains]CLion(VS2019) + CMake + Vcpkg 的使 ...
- 汇编 | CPU物理地址本质理解
物理地址 我们知道,CPU访问内存单元时,要给出内存单元的地址.所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址. CPU通 ...
- Hbase结构和原理
Hbase是什么? HBase是一种构建在Hadoop HDFS之上的分布式.面向列的存储系统.在需要实时读写.随机访问超大规模数据集时,可以使用HBase. HBase依赖Zookeeper,默认 ...
- 玩转AIGC,5分钟 Serverless 部署 Stable Diffustion 服务
有没有一种可能,其实你早就在AIGC了?阿里云将提供免费Serverless函数计算产品资源,邀请你,体验一把AIGC级的毕加索.达芬奇.梵高等大师作画的快感.下面请尽情发挥你的想象空间!!双重奖品设 ...
- VScode快捷键和设置
https://blog.csdn.net/qq_35206261/article/details/85207428
- Vue项目实现导入导出Excel表格功能
前提:在我的项目中我使用的是ElementUi前端UI框架,用到的是里面的Upload上传组件. 第一步:需要安装三个依赖 npm install -S file-saver xlsx (这里其实安 ...
- 信息收集-CDN绕过
什么是CDN加速? CDN 的全称是 Content Delivery Network,即内容分发网络.CDN 是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器, 通过中心平台的负载 ...
- WIN32 动态 UAC 提权
UAC(User Account Control) 是 Windows 平台的用户权限控制.它可以让程序使用管理员权限执行某些操作. 静态 UAC 提权 静态 UAC 提权让程序一直运行在管理员权限下 ...
- zookeeper 使用api 进行节点增删改查及实现简易的配置中心
本文为博主原创,未经允许不得转载: 目录: 1. 对 zookeeper 节点进行增删改查既配置acl 权限等 2.使用 zookeeper 实现一个简易的配置中心 1. 对 zookeeper 节 ...
