文档章节

Golang 调用汇编代码,太方便啦

曾赛
 曾赛
发布于 2013/04/19 15:56
字数 372
阅读 2138
收藏 9

今天在翻阅Golang代码时,发现了Golang调用汇编代码的方法(详见pkg/bytes)。大概要做三件事,我以用汇编实现一个判断字符串是否相等的方法Equal为例,测试一下:

准备工作,创建工程目录:

asm_demo
|--bin
|--pkg
|--src
|    |--strlib
|    |--demo

第一、编写平台对应的编码代码。

汇给代码文件以如下格式的命名:asm_$ARCH.s (asm_386.s, asm_amd64.s, asm_arm.s, ...),我的环境是Ubuntu 12.04 LTS amd64架构.

$ GOPATH=<youpath>/asm_demo
$ cd $GOPATH
$ cat <<EOF > src/strlib/asm_amd64.s
TEXT .Equal(SB),7,$0
        MOVL    len+8(FP), BX
        MOVL    len1+24(FP), CX
        MOVL    $0, AX
        CMPL    BX, CX
        JNE     eqret
        MOVQ    p+0(FP), SI
        MOVQ    q+16(FP), DI
        CLD
        REP; CMPSB
        MOVL    $1, DX
        CMOVLEQ DX, AX
eqret:
        MOVB    AX, ret+32(FP)
        RET
EOF

本段代码来自 $GOROOT/src/pkg/bytes/asm_amd64.s
可以看出,其中的语法大致和Linux汇编一致,只是寄存器表示不相同,是来自plan9的语法吗?哪个同鞋可以科普一下?

第二件事,就是让用Go语言封装一下这个API,让编译器可以识别:

$ cat <<EOF > src/strlib/equal.go
package strlib

func Equal(a[]byte, b[]byte) bool

EOF

最后一件事,使用之:

$ cat <<EOF > src/demo/main.go
package main

import "strlib"

func main() {
  e := strlib.Equal([]byte("hello"), []byte("hello"))
  println(e)

  e := strlib.Equal([]byte("hessssllo"), []byte("hello"))
  println(e)  
}
EOF


执行看看效果:

$ go run src/demo/main.go
true
false

调用成功,使用起来非常简单,也很易读。

结果是出来了,其中还有好多疑问。

© 著作权归作者所有

共有 人打赏支持
曾赛

曾赛

粉丝 352
博文 259
码字总数 81359
作品 0
成都
高级程序员
私信 提问
加载中

评论(1)

一一叶
一一叶
golang 的汇编 是基于 plan9汇编,但有些不同。 比如:FUNCDATA,PCDATA 汇编语句 是golang 编译器加上的,用于垃圾回收。
深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底...

万建宁
2018/07/17
0
0
嵌入在 Python 的 x86-64 汇编器--PeachPy

PeachPy 是一个用于编写高性能汇编内核的 Python 框架,可在汇编中编写模块。 它自动化了一些细节,并允许使用 Python 生成重复的汇编代码序列。 PeachPy 旨在简化编写优化的汇编内核,同时保...

匿名
2016/12/05
736
0
Golang汇编命令解读

我们可以很容易将一个golang程序转变成汇编语言。 比如我写了一个main.go: 使用命令: 我们就获取了main.S是main.go的汇编版本。

王二狗子11
2018/01/07
0
2
一步步将ffmpeg封装golang/cgo库

欢迎访问博客原文:https://lightfish.cn/2018-12-24-ffmpeg-cgo 前言 继上一篇 ffmpeg音视频C编程入门, 使用高性能的C语言进行音视频的处理,比较执行效率比较高,但是业务需求,快捷开发需...

光鱼
01/22
0
0
Golang profiling and optimizing

本文总结自Profiling and Optimizing Go,对应的PPT,有梯子的可以直接看视频,没梯子的也可以看下这篇文章:) 。 Golang的runtime内建了强大的分析工具pprof,能帮助我们对程序运行时的CPU、...

Rokety Yang
2018/01/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql 系统设置SQL

打开、关闭日志 SET GLOBAL general_log = 'Off'; SET GLOBAL general_log = 'On'; 查看日志是否打开 show variables like '%general%';...

jingshishengxu
今天
2
0
转行学大数据,如何选择如何学习大数据开发?

大数据火了几年了,但是今年好像进入了全民大数据时代,本着对科学的钻(zhun)研(bei)精(tiao)神(cao),我在17年年初开始自学大数据,后经过系统全面学习,于这个月跳槽到现任公司。 现在已经...

董黎明
今天
4
0
RadosClient OSDC

RadosClient.h class librados::RadosClient : public Dispatcher//继承自Dispatcher(消息分发类){public: using Dispatcher::cct; md_config_t *conf;//配置文件private: ......

banwh
今天
3
0
如果让你写一个消息队列,该如何进行架构设计?

面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做过较为深入的原理的了解,或者...

李红欧巴
今天
6
0
错题

无知的小狼
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部