如何在Xcode 6.1.1上重复GNU汇编程序中的指令?

时间:2015-02-28 15:50:37

标签: xcode assembly gas

我正在尝试使用Xcode6.1.1编译代码(我想用GNU汇编程序),目标是iPad air2(aarch64)

    .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

但是上面的代码编译失败了。我意识到“我”是符号但不是价值,我找到“.irp符号,值”并编写新版本。

    .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]

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分: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

(根据需要调整列表。)