c/c++语言开发共享如何将程序执行跳转到C中的特定地址?

我希望程序跳转到内存中的特定地址并继续从该地址执行。 我想过使用goto但是我没有标签而只是内存中的地址。

无需担心从跳转地址返回。

编辑:使用GCC编译器

    内联汇编可能是最简单,最“优雅”的解决方案,尽管这样做非常不寻常,除非您正在编写调试器或某些专门的内省系统。

    另一种选择可能是声明一个指向void函数的指针( void (*foo)(void) ),然后将指针设置为包含你的地址,然后调用它:

     void (*foo)(void) = 0x12345678; foo(); 

    由于编译器认为你正在进行子程序调用,因此堆栈上会有东西被推送,但由于你不关心返回,这可能会有效。

    gcc有一个允许跳转到任意地址的扩展名:

     void *ptr = (void *)0x1234567; // a random memory address goto *ptr; // jump there -- probably crash 

    这与使用设置为固定值的函数指针几乎相同,但实际上它将使用跳转指令而不是调用指令(因此堆栈不会被修改)

     #include  #include  void go(unsigned int addr) { (&addr)[-1] = addr; } int sub() { static int i; if(i++ < 10) printf("Hello %dn", i); else exit(0); go((unsigned int)sub); } int main() { sub(); } 

    当然,这会调用未定义的行为,取决于平台,假设代码地址与int等相同,等等。

    它应该看起来像这样:

     unsigned long address=0x80; void (*func_ptr)(void) = (void (*)(void))address; func_ptr(); 

    但是,它不是一个非常安全的操作,跳转到某个未知地址可能会导致崩溃!

    由于这个问题有一个C ++标签,这里是一个C ++调用函数的例子,它带有一个签名,如main() – int main(int argc, char* argv[])

     int main(int argc, char* argv[]) { auto funcAddr = 0x12345678; //or use &main... auto result = reinterpret_cast(funcAddr)(argc, argv); } 

    您是否可以控制要跳转到的地址的代码? 这是C还是C ++?

    我犹豫地建议使用setjmp() / longjmp()如果你正在使用C并且可以运行setjmp() ,你需要跳回去。 话虽这么说,你必须非常小心这些。

    至于C ++,请参阅以下有关longjmp()快捷方式exception处理和析构函数析构函数的讨论。 这会让我更加犹豫,建议在C ++中使用它。

    C ++:安全使用longjmp和setjmp?

    我提议这段代码:

     asm( "LDR R0,=0x0a0000nt" /* Or 0x0a0000 for the base Addr. */ "LDR R0, [R0, #4]nt" /* Vector+4 for PC */ "BX R0" ); 

    这就是我用于我的引导加载程序(MSP430AFE253,Compiler = gcc,CodeCompeserStudio);

     #define API_RESET_VECT 0xFBFE #define JUMP_TO_APP() {((void (*)()) (*(uint16_t*)API_RESET_VECT)) ();} 

      以上就是c/c++开发分享如何将程序执行跳转到C中的特定地址?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/545684.html

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐