![](/img/trans.png)
[英]Why does GCC produce extra ADDS instruction after LDR for loading an .rodata pointer on ARM thumb instruction set?
[英]Apple AS and ARM/Thumb ADDS instruction
我正在開發一個iPhone / iPad項目,我想在一些(不是全部)算術運算期間更新狀態寄存器。 默認情況下,Xcode使用'Compile for Thumb',我不想更改它。
以下GCC內聯匯編代碼在ARM下工作正常,但在Thumb下導致編譯錯誤:Thumb16模式下不支持指令 - 添加r6,r4,r5'。 問題在於狀態寄存器更新。 (我也知道需要更改movcs
和strcs
)。
Thumb是否有ADD指令在CPSR中設置溢出(V)或進位(C)? 如果沒有,是否有特定於Thumb的程序集級別的變通方法來測試溢出和攜帶?
uint32_t result, a, b;
int no_carry = 1;
...
__asm__
(
"ldr r4, %[xa] ;" // R4 = a
"ldr r5, %[xb] ;" // R5 = b
"adds r6, r4, r5 ;" // R6 = R4 + R5, set status
"movcs r4, #0 ;" // set overflow (if carry set)
"strcs r4, %[xc] ;" // store it (if carry set)
"str r6, %[xr] ;" // result = R6
: [xr] "=m" (result), [xc] "=m" (no_carry)
: [xa] "m" (a), [xb] "m" (b)
: "r4", "r5", "r6"
);
...
編輯:還需要移植寄存器以利用ARM體系結構的應用程序二進制接口(ABI)中的ARM ABI 。
伊戈爾建議“.syntax_unified”。 但是,至少對於binutils 2.22,命令是“.sytax unified”。 以下示例在此處編譯正常:
.align 4
.code 16
.syntax unified
adds r0,r0,r2
adc r1,r1,r3
我對XCode和Apple的工具鏈不是很熟悉,但我懷疑它可能是在UAL之前的舊版本中進行組裝。 ADD的Thumb-16編碼始終設置標志(對於寄存器R0-R7),但是,在UAL前組件中,S未添加到助記符中。 (大多數算術運算總是更新Thumb-16中的標志,因此暗示了S.)因此,您應該嘗試在程序集塊的開頭添加.syntax_unified
,或使用簡單的ADD助記符。
但是,您的代碼中還有另一個問題。 Thumb-16不支持條件指令,只支持條件分支。 因此,您必須使用分支重做代碼,或使用ADC / SBC。
請注意,以上所有內容僅適用於原始的Thumb ISA(又名Thumb-16)。 Thumb-2(又名Thumb-32)可以(幾乎)執行ARM所能做的任何事情,包括使用高位寄存器和條件指令,但它在ARMv6目標中不可用(這可能是XCode中的默認值)。
根據Thumb-16快速參考指南 , ADDS
指令應該可用。 這似乎是匯編程序中的錯誤(由@dwelch確認)。
我發現我可以通過發出使用匯編指令預編碼的指令來解決它。 例如:
__asm__
(
"ldr r0, %[xa] ;" // R0 = a
"ldr r1, %[xb] ;" // R1 = b
"adds r1, r1, r0 ;" // R1 = a + b
...
);
將通過以下方式實現:
__asm__
(
"ldr r0, %[xa] ;" // R0 = a
"ldr r1, %[xb] ;" // R1 = b
".inst.w 0x1809 ;" // Issue 'adds r1, r1, r0'
...
);
如果我想adds r2, r2, r1
,代碼應該發出.inst.w 0x1852
,依此類推。
編輯:代碼最近由於arm thumb2 ldr.w語法更新? 在Binutils郵件列表上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.