张成岗(CZ)的博客世界分享 http://blog.sciencenet.cn/u/zcgweb 脑损伤与脑保护;神经认知;生物信息;蛋白质组;辐射损伤与防护

博文

[转载]Golang 调用汇编代码,太方便啦

已有 2480 次阅读 2020-11-17 12:12 |系统分类:科研笔记|文章来源:转载

https://my.oschina.net/zengsai/blog/123916


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

原创

曾赛

小地鼠

2013/04/19 15:56

阅读数 1W

今天在翻阅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.sTEXT .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, AXeqret:
        MOVB    AX, ret+32(FP)
        RETEOF

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

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

$ cat <<EOF > src/strlib/equal.gopackage strlibfunc Equal(a[]byte, b[]byte) boolEOF

最后一件事,使用之:

$ cat <<EOF > src/demo/main.gopackage mainimport "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.gotruefalse

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

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




https://wap.sciencenet.cn/blog-40692-1258742.html

上一篇:世界现代化论坛·论坛会员:张成岗 研究员 北京中医药大学
下一篇:科学才是硬道理、科学就是硬道理:用数据来说话,就好办了
收藏 IP: 124.207.31.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (17 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-19 20:04

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部