转到C中的特定地址

时间:2013-10-04 04:55:23

标签: c pointers assembly goto pointer-address

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

我想用

goto 0x10080000

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

3 个答案:

答案 0 :(得分:10)

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

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

更明确一点:

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

asm("jump 0x10080000");