使用GCC嵌入式ARM asm跳转到地址

Paschalis

我想使用branch到一个特定的地址(没有标签)ARM assembly,而无需修改LR寄存器。因此,我选择B而不是BLBX我希望在GCC inline asm

是文档,这是我尝试过的内容:

#define JMP(addr) \
    __asm__("b %0" \
            : /*output*/ \
            : /*input*/ \
            "r" (addr) \
           );

它是一个C宏,可以使用来调用address当我运行它时,出现以下错误:

error: undefined reference to 'r3'

该错误是由于使用"r"我仔细研究了一下,发现它可能是gcc 4.9。*版本的错误。

顺便说一句,我使用的Android/Linux Gcc 4.9 cross compiler,上OSX另外,我不知道是否应该在上加载某些内容Rm

干杯!

编辑:我将宏更改为此,并且我仍然得到undefined reference to r3 and r4

#define JMP(addr) \
    __asm__("LDR r5,=%0\n\t" \
            "LDR r4,[r5]\n\t"\
            "ADD r4,#1\n\t" \
            "B r4" \
            : /*output*/ \
            : /*input*/ \
            "r" (addr) \
            : /*clobbered*/ \
            "r4" ,"r5" \
           );

说明:将变量的地址加载到r5,然后将该地址的值加载到r4。然后将LSB加1(ARM规范要求是mm?)。最后转到该地址。

罗斯里奇

您不能分支到寄存器,只能分支到标签。如果要跳转到寄存器中的地址,则需要将其移入PC寄存器(r15)。

#define JMP(addr) \
    __asm__("mov pc,%0" \
            : /*output*/ \
            : /*input*/ \
            "r" (addr) \
           );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是什么使我无法使用ASM跳转到任何绝对地址?

嵌入式Linux ARM引导地址

ARM汇编-BL正在跳转到错误的地址

ARM嵌入式ASM:退出系统调用,并从内存中读取值

从地址获取嵌入式街景

NGINX - 使用 proxypass 跳转到 https 跳转到上游

UINavigationBar从大标题跳转到小标题,同时推送到带有嵌入式UITableView iOS 11的UIViewController

在C ++嵌入式ASM中使用基本指针寄存器

如何使用嵌入式码头在给定地址提供特定的类路径资源?

使用 ID 跳转到超链接的问题

如何使用嵌入式C启动ARM Cortex编程?

怎么更快?使用“ FPU技巧”的52位模乘运算比x64上的嵌入式ASM更快

条件跳转到内存地址

单击链接转到包含嵌入式内容的页面时,嵌入不会显示

带有 ARM Gcc 的嵌入式 C++,删除不必要的 STL 函数

错误:跳转到标签“失败” [-fpermissive],GCC与VS

使gcc警告“跳转到标签交叉变量的初始化”

嵌入式环境中操作员的地址返回无效地址

转到:派生类型中嵌入式类型的字段初始化

使用Facebook SDK登录后跳转到View Controller

如何使用 Android Studio 跳转到方法的末尾

从VIM使用grep时,如何跳转到结果?

Emacs:使用相同的缩进跳转到下一行

跳转到特定地址以运行应用程序的C效果

nasm x86,条件跳转到动态地址

如何获取结构中嵌入式切片的内存地址?

带有嵌入式Mongo的Spring Boot:无法分配请求的地址:JVM_Bind

如何将数组指向嵌入式系统上的某些特定内存地址

您对ARM开发建议使用哪种Java嵌入式VM?