![](/img/trans.png)
[英]In arm assembly language, will " sub r3, r2, 5 " modify the value stored in r2?
[英]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
-O2
編譯,它將使用更多的寄存器,因此我假設這是GCC選擇執行的操作。 不確定為什么或由哪個開關控制此行為。 ARM ABI在其他處理器系列中並不罕見,它是當編譯器為目標生成代碼時,一些寄存器用於傳遞參數,一個/一些寄存器用於返回結果,而某些寄存器不必保留它們,基本上您可以放心使用它們,如果需要使用它們,則需要保留其余的寄存器(將其從棧中推入/彈出)。
arm使用r0-r3傳遞參數,並使用r0返回結果。 r0-r3也被認為是可拋棄的(也許還有一個更高的寄存器),因此如果程序足夠簡單並且不需要太多寄存器,它將嘗試使用r0-r3來提高性能(不需要使用堆棧)。
編寫高級代碼來驅動機器代碼是一種藝術形式,您需要了解編譯器和處理器等。您在正確的道路上,但需要編寫更多的函數來編譯和檢查生成的機器代碼。
寄存器的使用由兩個約束定義,然后再次有效地使用它們取決於編譯器。
ABI是一個約定,顧名思義,它提供二進制兼容性。 ARM ABI , ABI的一部分,定義了哪些寄存器用於函數調用。 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.