首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交换机实现;arm;汇编程序;aarch64;arm64

交换机实现;arm;汇编程序;aarch64;arm64
EN

Stack Overflow用户
提问于 2015-09-07 01:42:20
回答 1查看 1.3K关注 0票数 0

我对在aarch64汇编程序上实现‘开关’操作符的方法很感兴趣。在arm32平台上,我使用了

代码语言:javascript
复制
    ldr         pc,         [pc, ta, LSL#2]
    nop                                         // alignment
    .int        .L.case1
    .int        .L.case2
    ...
    .int        .L.caseN

但是由于64位版本对“pc”寄存器的使用有很多限制,这样的实现不再有效。

似乎最简单的方法是使用对比较和分支操作,如

代码语言:javascript
复制
cmp ta, #1
b.eq .L.case1
cmp ta, #2
b.eq .L.case2
...

但有时会有多达十几个案件,这将导致一个重大的延迟,然后才能到达最后的“案件”。

请您分享一下如何在aarch64上实现快速切换的想法。

谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 05:29:44

我没有64位ARM汇编程序来测试这一点,但我相信您会执行如下操作来实现跳转表:

代码语言:javascript
复制
    adr  x0, jmp_table
    ldr  x0, [x0, x1, LSL#3]
    br   x0

jmp_table:
    .quad .L.case1
    .quad .L.case2
    .quad .L.case3

第一个指令阿德鲁将标签的地址加载到寄存器中。最后一条指令BR跳转到存储在寄存器中的地址。

如果要创建共享库或与位置无关的可执行文件,可以尝试如下所示:

代码语言:javascript
复制
    adr  x0, jmp_table
    add  x0, x0, x1, LSL#2
    br   x0

jmp_table:
    b .L.case1
    b .L.case2
    b .L.case3

备用PIC示例

代码语言:javascript
复制
    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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32430071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档