簡體   English   中英

Go 對 ARM 寄存器 R10 和 R11 的限制

[英]Go restrictions on ARM registers R10 and R11

我希望將高度優化的加密 ASM 實現移植到 Go ASM。 Go Arm 組件的唯一文檔是快速指南,其中提到了以下內容:

  • 寄存器 R10 和 R11 由編譯器和 linker 保留。
  • R10 指向 g(goroutine)結構。 在匯編源代碼中,這個指針必須被稱為 g; 名稱 R10 無法識別。
  • 手寫匯編可以使用 R11,但這樣做需要確保 linker 也沒有使用它來實現 function 中的任何其他指令。

我要移植的 ASM 使用R10R11 ,所以我的問題如下:

  • 我可以使用 R10/g 嗎?
  • 如果我使用R10/g,只要在調用開始時將R10的值存入棧,然后在最后加載,會不會有問題? (假設go:nosplit用於停止搶占行為)
  • 只要我不從 Go ASM 調用任何其他函數,那么我就不必擔心 R11 上的 linker 限制,對嗎?

如果您的代碼被搶占或發生恐慌,您不應觸摸R10 我相信指南對此非常清楚。

linker 使用R11來綜合一些指令,例如對全局變量的引用。 最好通過匯編然后反匯編代碼來檢查是否使用了R11 在反匯編中,應該可以看到 linker 引入的任何對R11的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM