2015-02-28 4 views
0

Я пытаюсь скомпилировать код, используя Xcode6.1.1 (я думаю с GNU ассемблер), с целью для IPad AIR2 (aarch64)Как повторить инструкцию в сборщике GNU на Xcode 6.1.1?

.macro saving_callee_prsv_regi used_regi_index 
     .if \used_regi_index >= 19 
     i = 19 
     .rept \used_regi_index - 19 
      str x\i,[sp,#-8*(\i-18)] // fail here: x\i 
      i = i + 1 
     .endr 
     .endif 
    .endm 

Но выше отказа код компиляции. Я понимаю, что «i» является символом, но не значением, я нахожу «.irp symbol, values» и пишу новую версию.

.macro saving_callee_prsv_regi_2 used_regi_index 
     .if \used_regi_index >= 19 
     i = 19 
     .rept \used_regi_index - 19 
      .irp idx, i // fail here, "i" is expression not value?! 
      str x\idx,[sp,#-8*(\idx-18)] 
      i = i + 1 
     .endr 
     .endif  
    .endm 

в то время как новый код еще не выдержало компиляции, мой ожидаемый результат:

когда saving_callee_prsv_regi 19 ->

str x19,[sp,#-8] 

когда saving_callee_prsv_regi 22 ->

str x19,[sp,#-8] 
    str x20,[sp,#-16] 
    str x21,[sp,#-24] 
    str x22,[sp,#-32] 

Любое предложение? Благодаря!

ответ

0

GNU ассемблер был в первую очередь разработан как бэкэнд для компилятора C, поэтому у него отсутствуют функции для людей. Лучшее, что я мог придумать следующий:

.macro saving_callee_prsv_regi used_regi_index 
    .irp i, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 
     .if \i <= \used_regi_index 
      str x\i,[sp,#-8*(\i-18)] 
     .endif 
    .endr 
.endm 

(. Отрегулировать список по мере необходимости)

+0

спасибо за ответ, это работает! В то время как из aar64 ABI только r19 ~ r28 является зарегистрированным регистром, r29: FP r30: LR r31: регистр стека, я боюсь, что это может быть задача не для того, чтобы спасти их. Я неправильно понял, что? – charlie