我试图了解如何在 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