我正在尝试使用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]
有什么建议吗?谢谢!
答案 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
(根据需要调整列表。)