转到 C 中的特定地址

问题描述 投票:0回答:4

如何JMP到C中的特定地址?

我想用

goto 0x10080000

这不起作用,还有其他方法可以更改程序计数器的地址吗?

c pointers assembly goto pointer-address
4个回答
11
投票

您可以将地址转换为函数指针,然后跳转到:

((void (*)(void))0x10008000)();

为了更清楚一点:

typedef void (*func_t)(void);
...
((func_t)0x10008000)();

但是这是一个函数,编译器会发出一条期望返回的分支指令(然后由你决定你的函数是否返回)。 另请注意,编译器将生成一段代码,期望在给定地址找到 C 函数,了解如何给出和返回函数参数。

如果需要发出不返回的分支指令,则需要使用内联汇编。


10
投票

在 GCC 中,您可以使用 计算转到。我自己没有尝试过,但它应该像这样工作:

void *address = 0x10080000;
...
goto *address;

3
投票

内联汇编指令也应该有效:

asm("jump 0x10080000");


0
投票

我尝试了 asm("jump 0x10080000") 但出现消息“未知操作码或格式名称'jump'”。我在 Arduino IDE 中使用 ESP32。

我的错误可能是什么?

我提前非常感谢您的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.