2011-06-20 73 views
2

我正在開發一個iPhone/iPad項目,我想在某些(並非全部)算術運算期間更新狀態寄存器。默認情況下,Xcode使用「爲Thumb編譯」,我不想改變它。Apple AS和ARM/Thumb ADDS指令

以下GCC內聯彙編代碼在ARM下工作正常,但會導致Thumb下的編譯錯誤:'Thumb16模式下不支持'指令 - 添加r6,r4,r5'。問題在於狀態寄存器更新。 (我也知道movcsstrcs將需要更改)。

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 at Application Binary Interface (ABI) for the ARM Architecture的優勢。

+0

你看過「編譯爲Thumb」的編譯設置嗎?對不起,不得不問。 –

回答

0

根據Thumb-16 Quick Reference GuideADDS指令應該可用。這似乎是彙編程序中的一個錯誤(正如@dwelch所證實的那樣)。

我發現我可以通過發佈使用匯編程序指令預編碼的指令來解決它。例如:

__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,依此類推:

__asm__ 
(
    "ldr r0, %[xa] ;" // R0 = a 
    "ldr r1, %[xb] ;" // R1 = b 
    "adds r1, r1, r0 ;" // R1 = a + b 
    ... 
); 

將使用來實現。

編輯:代碼最近由於Binutils郵件列表上的arm thumb2 ldr.w syntax?而更新。

4

我對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中的默認設置)。

+0

「然而,你的代碼中有另一個問題......」GAS停止抱怨太快(在ADDS之後)。謝謝 - 修正。 – jww

+0

「ADD的Thumb-16編碼總是設置標誌」 - 這很有趣。根據以下鏈接,在Thumb16上支持ADDS。也許這是Apple的GAS中的一個錯誤。請參閱http://infocenter.arm.com/help/topic/com.arm.doc.qrc0006e/QRC0006_UAL16.pdf。 – jww

+1

所有當前ARM文檔都使用UAL語法,並明確指定了S。檢查ARM體系結構參考手冊,遺留指令助記符部分。 –

4

伊戈爾建議「.syntax_unified」。但是,至少對於binutils 2.22,命令是「.sytax unified」。下面的例子在這裏編譯得很好:

.align 4 
.code 16 
.syntax unified 

adds r0,r0,r2 
adc r1,r1,r3