【问题标题】:Goto a specific Address in C转到 C 中的特定地址
【发布时间】:2023-04-06 01:26:01
【问题描述】:

如何跳转到 C 中的特定地址?

我想用

goto 0x10080000

这不行,有没有其他方法可以改变程序计数器的地址??

【问题讨论】:

  • 如果你知道地址,你总是可以说asm("jmp 0x10080000")...

标签: c pointers assembly goto pointer-address


【解决方案1】:

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

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

为了更清楚一点:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      内联汇编指令也应该起作用:

      asm("jump 0x10080000");

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 2020-05-25
        • 2014-07-14
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        相关资源
        最近更新 更多