我对在aarch64汇编程序上实现‘开关’操作符的方法很感兴趣。在arm32平台上,我使用了
ldr pc, [pc, ta, LSL#2]
nop // alignment
.int .L.case1
.int .L.case2
...
.int .L.caseN但是由于64位版本对“pc”寄存器的使用有很多限制,这样的实现不再有效。
似乎最简单的方法是使用对比较和分支操作,如
cmp ta, #1
b.eq .L.case1
cmp ta, #2
b.eq .L.case2
...但有时会有多达十几个案件,这将导致一个重大的延迟,然后才能到达最后的“案件”。
请您分享一下如何在aarch64上实现快速切换的想法。
谢谢:)
发布于 2015-09-07 05:29:44
我没有64位ARM汇编程序来测试这一点,但我相信您会执行如下操作来实现跳转表:
adr x0, jmp_table
ldr x0, [x0, x1, LSL#3]
br x0
jmp_table:
.quad .L.case1
.quad .L.case2
.quad .L.case3第一个指令阿德鲁将标签的地址加载到寄存器中。最后一条指令BR跳转到存储在寄存器中的地址。
如果要创建共享库或与位置无关的可执行文件,可以尝试如下所示:
adr x0, jmp_table
add x0, x0, x1, LSL#2
br x0
jmp_table:
b .L.case1
b .L.case2
b .L.case3备用PIC示例
adr x0, jmp_table
ldr w1, [x0, x1, LSL#2]
add x0, x0, x1
br x0
jmp_table:
.int .L.case1 - jmp_table
.int .L.case2 - jmp_table
.int .L.case3 - jmp_tablehttps://stackoverflow.com/questions/32430071
复制相似问题