如何在Golang中使用在汇编代码中定义的函数?

在golangs AES加密软件包中 cipher_amd64.go 使用了汇编代码中定义的功能( asm_amd64.s )。 在提到的go文件中,仅定义了函数标头:</ p>

  //在asm_amd64.s 
func cryptoBlockAsm(nr int,xk * uint32,dst,src * byte)中定义
func deleteBlockAsm(nr int,xk * uint32,dst,src * byte)
func expandKeyAsm(nr int,key * byte,enc * uint32,dec * uint32)
</ code> </ pre>

如何在自己的代码中使用这些功能? 仅声明标题并按上述.go文件中的说明导入“ crypto / aes”不起作用( undefined:expandKeyAsm </ code>)。</ p>

非常感谢! </ p>
</ div>

展开原文

原文

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!

duandun3178
duandun3178 别客气。我将其回答,以便您可以接受。
大约 3 年之前 回复
du2986
du2986 谢谢!这就是我要的信息。
大约 3 年之前 回复
douketangyouzh5219
douketangyouzh5219 goroutines.com/asm和golang.org/doc/asm
大约 3 年之前 回复
dongnius85154
dongnius85154 将asm_amd64.s和cipher_amd64.go文件复制到您的项目中。.s文件将自动编译。然后去寻找依赖项(也就是剥离不需要的所有东西)
大约 3 年之前 回复
dsegw3424
dsegw3424 但是如何复制汇编代码?我不明白如何将其连接到我的代码。它看起来像一个c文件,因为它具有标题导入!
大约 3 年之前 回复
dongleiqiao2107
dongleiqiao2107 然后复制所需的部分,并将其放入您自己的库中。
大约 3 年之前 回复
dongyan1993
dongyan1993 是的,通常来说,酿造自己的加密汤是个坏习惯。但是我正在尝试实现一种与原始AES稍有不同的算法。因此,在某些情况下,我需要访问较低级别的功能。aes.NewCipher(your_aes_key)应该适合我的需求,但是我想在没有AES算法的InitialRound和FinalRound的情况下运行加密。
大约 3 年之前 回复
douyou9923
douyou9923 使用高级功能,甚至可以使用golang.org/x/crypto/nacl,并远离加密实现的繁琐细节。
大约 3 年之前 回复
dtry54612
dtry54612 有一个原因,您不能只使用aes.NewCipher(your_aes_key)之类的东西来创建新的密码。该块可与crypto/cipher包中的各种功能一起使用,以根据需要进行加密/解密?
大约 3 年之前 回复
dongxinyue2817
dongxinyue2817 由于源代码可用,如何使它们在我的代码中可访问?Go没有头文件,但是汇编文件使用#include“textflag.h”。
大约 3 年之前 回复
dongle7553
dongle7553 这些功能不会导出,因此您无法使用它们。
大约 3 年之前 回复

1个回答

  1. Copy the asm_amd64.s contents over to your package
  2. Define the functions somewehere in that package
  3. 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
", nr, xk, dst, src)

    encryptBlockAsm(nr, &xk, &dst, &src)

    fmt.Printf("After:\t%v, %v, %v, %v
", 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 :)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问