【问题标题】:How to repeat an instruction in GNU assembler on Xcode 6.1.1?如何在 Xcode 6.1.1 上重复 GNU 汇编器中的指令?
【发布时间】:2015-03-01 07:44:03
【问题描述】:

我正在尝试使用 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

但是上面的代码编译失败。我意识到“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

虽然新代码仍然无法通过编译,但我的预期结果是:

当 save_callee_prsv_regi 19 -->

    str x19,[sp,#-8]

当 save_callee_prsv_regi 22 -->

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

有什么建议吗?谢谢!

【问题讨论】:

    标签: xcode assembly gnu-assembler


    【解决方案1】:

    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
    

    (根据需要调整列表。)

    【讨论】:

    • 感谢您的回答,它有效!而从 aarch64 ABI 来看,只有 r19~r28 是被调用者保存的寄存器,r29:FP r30:LR r31:stack-register,恐怕保存它们可能不是被调用者的工作。我误会了吗?
    猜你喜欢
    • 2021-03-04
    • 2010-10-18
    • 2014-06-19
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多