簡體   English   中英

編譯為ARM芯片上的ASM,為什么只使用r1,r2和r3寄存器

[英]Compiling to ASM on an ARM chip, why are only r1, r2 and r3 registers used

我只是開始研究Raspberry Pi上的ARM組件(在評論中感謝任何指向優秀文檔的鏈接)

我有一個使用以下命令編譯為匯編器的C ++程序

 g++ -S -fverbose-asm -march=armv6j -mtune=arm1176jzf-s file.cpp

然后,我可以檢查file.s,它很棒,而且很有意義。 但是我認為ARM芯片有15個通用寄存器,我讀到的這段代碼是僅使用r1-r3

mov     r3, r3, asl #1  @ tmp166, tmp166,
add     r3, r3, r2      @ tmp166, tmp166, D.24883
mov     r2, r3, asl #3  @ tmp167, tmp166,
add     r3, r3, r2      @ tmp166, tmp166, tmp167
rsb     r2, r3, r1      @ D.24883, tmp166, tmp161

在生成的代碼中看不到比r3高的寄存器。 我從根本上了解什么? 是否有充分的理由呢? 還是生成的代碼不是最優的?

UPDATE

  1. 如果我使用-O2編譯,它將使用更多的寄存器,因此我假設這是GCC選擇執行的操作。 不確定為什么或由哪個開關控制此行為。
  2. 我還讀到r1-r4可以在不重置其狀態的情況下使用,所以我猜對於較小的函數,這樣更有效嗎?

ARM ABI在其他處理器系列中並不罕見,它是當編譯器為目標生成代碼時,一些寄存器用於傳遞參數,一個/一些寄存器用於返回結果,而某些寄存器不必保留它們,基本上您可以放心使用它們,如果需要使用它們,則需要保留其余的寄存器(將其從棧中推入/彈出)。

arm使用r0-r3傳遞參數,並使用r0返回結果。 r0-r3也被認為是可拋棄的(也許還有一個更高的寄存器),因此如果程序足夠簡單並且不需要太多寄存器,它將嘗試使用r0-r3來提高性能(不需要使用堆棧)。

編寫高級代碼來驅動機器代碼是一種藝術形式,您需要了解編譯器和處理器等。您在正確的道路上,但需要編寫更多的函數來編譯和檢查生成的機器代碼。

寄存器的使用由兩個約束定義,然后再次有效地使用它們取決於編譯器。

  • ABI
  • ARM / Thumb執行狀態

ABI是一個約定,顧名思義,它提供二進制兼容性。 ARM ABIABI的一部分,定義了哪些寄存器用於函數調用。 ARM ABI狀態r0-r3用於函數調用。 支持ARM ABI的ARM編譯器需要采用這種方式,這意味着對寄存器使用的限制。

另一個約束是ARM / Thumb執行模式。 某些ARM CPU可以在Thumb執行模式下運行,在該模式下,大多數指令只能訪問ARM內核寄存器的前八個r0-r7(ARM ARM 4.1)。 這也限制了編譯器可以使用多少個寄存器。

其余部分取決於編譯器,優化模式和調試支持的質量。

您的代碼可能不夠復雜,不足以需要更多寄存器。

暫無
暫無

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

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