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

本文介绍了如何在Golang中调用汇编代码,以实现一个判断字符串是否相等的函数为例,详细阐述了创建工程目录、编写平台对应的汇编代码、使用Go语言封装API以及调用测试的过程。通过这种方法,可以方便地结合Golang和汇编的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在翻阅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

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

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

转载于:https://my.oschina.net/zengsai/blog/123916

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值