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

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

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

1asm_demo 2|--bin 3|--pkg 4|--src 5| |--strlib 6| |--demo

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

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

1$ GOPATH=<youpath>/asm_demo 2$ cd $GOPATH 3$ cat <<EOF > src/strlib/asm_amd64.s 4TEXT .Equal(SB),7,$0 5 MOVL len+8(FP), BX 6 MOVL len1+24(FP), CX 7 MOVL $0, AX 8 CMPL BX, CX 9 JNE eqret 10 MOVQ p+0(FP), SI 11 MOVQ q+16(FP), DI 12 CLD 13 REP; CMPSB 14 MOVL $1, DX 15 CMOVLEQ DX, AX 16eqret: 17 MOVB AX, ret+32(FP) 18 RET 19EOF

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

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

1$ cat <<EOF > src/strlib/equal.go 2package strlib 3 4func Equal(a[]byte, b[]byte) bool 5 6EOF

最后一件事,使用之:

1$ cat <<EOF > src/demo/main.go 2package main 3 4import "strlib" 5 6func main() { 7 e := strlib.Equal([]byte("hello"), []byte("hello")) 8 println(e) 9 10 e := strlib.Equal([]byte("hessssllo"), []byte("hello")) 11 println(e) 12} 13EOF

执行看看效果:

1$ go run src/demo/main.go 2true 3false

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang