Go ASM 関数との間でより複雑な値を送受信する方法を理解しようとしています。典型的な uint in、uint out のケースを超えています。crypto/elliptic
関数 p256BigToLittleを使用して、この高度な使用法の優れた例を偶然見つけましたp256_asm_arm64.s
。バイト スライスと uint64 スライスを受け取り、バイトを処理して出力値を uint64 スライスに入れます。以下は、プリプロセッサ定義ステートメントが置換された関数です。私が理解していない主なものは次のとおりです。
- define ステートメントが見つかりません。
res
これらin
はコンパイル時に .go ファイルの関数シグネチャから解決されますか? (IE: 関数を作成した場合、対応する asm ファイルでfunc myFunc(arg1 *int)
参照できますか?)arg1
- マジックナンバー
+24
はMOVD in+24(FP), R1
どこから来たのですか? 1*16(R1)
バイト スライス (8*2) の 2 番目の要素を指すことだけを意図していると思いますか? スライスの要素間の間隔はどのようにわかりますか?in
uint32 スライスの場合、2 番目の要素は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