我很有兴趣实现'切换' aarch64汇编程序上的运算符。 在arm32平台上,我使用了像
这样的东西 ldr pc, [pc, ta, LSL#2]
nop // alignment
.int .L.case1
.int .L.case2
...
.int .L.caseN
但是因为64位版本对“电脑”有很多限制。注册用法,这种实现不再起作用。
似乎最简单的方法是使用一对比较和分支操作,比如
cmp ta, #1
b.eq .L.case1
cmp ta, #2
b.eq .L.case2
...
但有时会出现多达十几起案件,并且会在到达最后一个案件之前导致严重延误。
请您分享一下如何在aarch64上实现快速切换的想法。
谢谢:)
答案 0 :(得分:1)
我没有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
第一条指令ADR将标签的地址加载到寄存器中。最后一条指令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_table