2

我试图了解如何在 Go ASM 函数之间发送更复杂的值;超出典型的 uint in, uint out 情况。我偶然发现了这个高级用法的一个很好的例子,它crypto/elliptic带有函数 p256BigToLittle in p256_asm_arm64.s。它需要一个字节切片和 uint64 切片,然后处理字节并将输出值放入 uint64 切片。下面是替换了预处理器定义语句的函数。以下是我不明白的主要内容:

  • 我找不到定义语句,res这些语句in是在编译时从 .go 文件中的函数签名解决的吗?(IE:如果我做了一个函数,我可以在相应的 asm 文件中func myFunc(arg1 *int)引用吗?)arg1
  • 里面的神奇数字+24 MOVD in+24(FP), R1从哪里来的?
  • 我假设这1*16(R1)只是指向字节切片(8 * 2)的第二个元素?你怎么知道切片元素之间的间距?如果in是 uint32 切片,第二个元素是1*64(R1)
  • 在所有这些过程中,Go Slice 标头在哪里?它是如何避免的?
// func p256BigToLittle(res []uint64, in []byte)
TEXT ·p256BigToLittle(SB),NOSPLIT,$0
    MOVD    res+0(FP), R0
    MOVD    in+24(FP), R1

    LDP 0*16(R1), (R3, R4)
    LDP 1*16(R1), (R5, R6)

    REV R3, R3
    REV R4, R4
    REV R5, R5
    REV R6, R6

    STP (R6, R5), 0*16(R0)
    STP (R4, R3), 1*16(R0)
    RET
4

0 回答 0