簡體   English   中英

Apple AS和ARM / Thumb ADDS指令

[英]Apple AS and ARM/Thumb ADDS instruction

我正在開發一個iPhone / iPad項目,我想在一些(不是全部)算術運算期間更新狀態寄存器。 默認情況下,Xcode使用'Compile for Thumb',我不想更改它。

以下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)中的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.

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