http://davidwong.fr/goasm/add
接下来就是对这组Sample的测试(simple搬砖)
目前的版本是1.9 好像方法都简单了不少(智能). 对于这个例子可以简单的测试.
命名很松散:
1. .s文件后缀小写. 并且文件名任意. 只要包含了我们的函数实现即可.
2. 函数中x+0(SB) y+0(SB) 前面x,y 都是名字. 而在go中声明的函数原型中的形参名x, y都是任意. 和.s实现没有任何关系. (只有参数位置有意义)
go build即可编译.
它总是很聪明的找到package main以及没有函数体的函数的汇编实现.
linux下面输入"点" Ctrl + Shift + u b7回车.
http://davidwong.fr/goasm/hello
这个例子来自于go tool compile -S hello.go (汇编输出到stdout)
http://davidwong.fr/goasm/sync-atomic
这个例子在JMP这条指令可能会出问题:
JMP ·SwapUint32(SB)
# test/as/cinco
runtime.pclntab: relocation target main.SwapUint32.args_stackmap not defined
runtime.pclntab: undefined: "main.SwapUint32.args_stackmap"
若·SwapInt32直接采用下面的实现就没有问题(省略JMP以及·SwapUint32这个函数).
消除错误: 要在go文件中声明SwapUint32这个函数. (参数及返回值都是uint32) .
The Go compiler will look for files ending in _GOOS
or _GOARCH
or _GOOS_GOARCH
toconsider which assembly file to compile. See go/build.
http://davidwong.fr/goasm/sqrt
另外在1.9的源码中的.s文件中可以找到这样的字样:
// +build amd64,!gccgo,!appengine