英文:
How to use functions defined in assembler code in golang?
问题
在Golang的AES加密包cipher_amd64.go中,使用了在汇编代码(asm_amd64.s)中定义的函数。在提到的go文件中,只定义了函数头部:
// 在asm_amd64.s中定义
func encryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func decryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func expandKeyAsm(nr int, key *byte, enc *uint32, dec *uint32)
我该如何在自己的代码中使用这些函数?只是像在提到的.go文件中那样声明头部并导入"crypto/aes"是不起作用的(undefined: expandKeyAsm
)。
非常感谢!
英文:
In golangs AES crypto package cipher_amd64.go makes use of functions that are defined in assembler code (asm_amd64.s). In the mentioned go file only the function headers are defined:
// defined in asm_amd64.s
func encryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func decryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func expandKeyAsm(nr int, key *byte, enc *uint32, dec *uint32)
How can I use these functions in my own code? Just declaring the headers and importing "crypto/aes" as in the mentioned .go file does not work (undefined: expandKeyAsm
).
Thank you very much!
答案1
得分: 0
将asm_amd64.s
的内容复制到你的包中
在该包的某个地方定义这些函数
在包中使用这些函数
示例(asm_amd64.s
与main
包在同一个包中):
package main
import "fmt"
func encryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func decryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func expandKeyAsm(nr int, key *byte, enc *uint32, dec *uint32)
func main() {
var nr int
var xk uint32
var dst byte
var src byte
fmt.Printf("Before:\t%v, %v, %v, %v\n", nr, xk, dst, src)
encryptBlockAsm(nr, &xk, &dst, &src)
fmt.Printf("After:\t%v, %v, %v, %v\n", nr, xk, dst, src)
}
输出结果:
Before: 0, 0, 0, 0
After: 0, 0, 231, 173
我不知道输入应该是什么,但至少可以证明这段代码有一些作用
英文:
- Copy the
asm_amd64.s
contents over to your package - Define the functions somewehere in that package
- Use those functions in the package
Example (with the asm_amd64.s in the same package):
package main
import "fmt"
func encryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func decryptBlockAsm(nr int, xk *uint32, dst, src *byte)
func expandKeyAsm(nr int, key *byte, enc *uint32, dec *uint32)
func main() {
var nr int
var xk uint32
var dst byte
var src byte
fmt.Printf("Before:\t%v, %v, %v, %v\n", nr, xk, dst, src)
encryptBlockAsm(nr, &xk, &dst, &src)
fmt.Printf("After:\t%v, %v, %v, %v\n", nr, xk, dst, src)
}
Yields:
Before: 0, 0, 0, 0
After: 0, 0, 231, 173
I have no idea what the inputs should be but at least it demonstrates this does something
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论