当前位置:首页 > 电子 > 正文内容

C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行

admin5年前 (2020-01-08)电子6939
1、方法一
    如果要对绝对地址0x200000进行赋值,我们可以用
      (unsigned int  * ) 0x200000 = 1234;//指针直接指向存储区地址
     那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
     *( (void (*)( ))0x100000 ) ( );
    首先要将0x100000强制转换成函数指针,即:
     (void (*)())0x100000
     然后再调用它:
   *((void (*)())0x100000)();
   用typedef可以看得更直观些:
    typedef void(*)() voidFuncPtr;
   *((voidFuncPtr)0x100000)();
 
又如
如果用 C 语言,可以像下列示例代码这样来调用内核:
void (*theKernel)(int zero, int arch, u32 params_addr)
= (void (*)(int, int, u32))KERNEL_RAM_BASE; 
…… 
theKernel(0, ARCH_NUMBER, (u32) kernel_params_start); 
KERNEL_RAM_BASE 是内核在系统内存中的第一条指令的地址。
2、方法二
C语言使用函数指针跳转到程序固定地址(0x8000)执行程序的方法

使用函数指针,把一个纯数据强制转换为函数指针类型。


int main(void)
{
  void (* my_function)(void);
  //int *my_address = 0x8000;
  my_function =(void (*)())(0x8000);
  my_function();
}


#include<stdio.h>
typedef void (*funcptr)(); //funcptr为无参数,无返回值的函数指针类型
void f(void) //随便一个无参数无返回值函数
{
  printf("aaa\n");
}

int main(void)
{
  //printf("%p", f); //通过此可知道函数f的地址。不同的环境可能会不一样,
  //我的是0x401530

  (*(funcptr) 0x401530)(); //将0x401530强制转换为funcptr类型,并解引用,再
  调用,因为funcptr为函数指针类型,所以0x401530被强制转换为函数指针,
  也就是说,将地址为0x401530的东西当作函数来看待,而函数 f 的地址正好是
  0x401530,所以直接调用函数 f 。

  (*(void (*)()) 0x401530)();
  return 0;
 } 



如果带参数的呢?



#include <stdio.h>

#define my_function(a,b) ((*(void(*)(int ,char ))0x40052d)(a,b))
void ppr(int a,char b)
{
    printf("hello,word!!%d ,%d",a,b);
}
int main(void)
{
    printf("%p\r\n",ppr);

    my_function(1,2);
}



其实更简单,不适用中间变量,直接一步到位:

(*(void(*)())0x8000)();

转成汇编就占两条指令.

扫描二维码推送至手机访问。

版权声明:本文由视觉博客发布,如需转载请注明出处。

本文链接:https://feelsight.cn/post/108.html

“C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行” 的相关文章

STM32 中断向量表的位置 、重定向

STM32 中断向量表的位置 、重定向

这篇文章已经说了STM32的启动过程: https://feelsight.cn/post/39.html 我们也知道怎么跳到main函数了,那么,中断发生后,又是怎么跑到中断入口地址的呢? 从stm32f10x.s可以看到,已经定义好了一大堆...

物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004

物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004

物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004 自从物联网问世以来,如何使得物 能够联网有了很多的方式,目前运用非常广的WIFI,今天就总结下自这个方面,也对于有需要的盆友也希望有抛砖引玉之效果。 来看个知乎...

内存堆和栈的区别

内存堆和栈的区别

在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。 堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以...

ESP8266发送HTTP请求GET请求POST请求

ESP8266发送HTTP请求GET请求POST请求

一、ESP8266简介   ESP8266 是深圳安信可科技有限公司开发的基于乐鑫ESP8266的超低功耗的UART-WIFI模块的模组,可以方便进行二次元开发,接入云端服务,实现手机3/4G全球随时随地的控制,加速产品原型设计。  &em...

正点原子阿波罗ST32F767试用

正点原子阿波罗ST32F767试用

一、             硬件整体介绍 1.       底板  &nb...

基于PIC单片机和AD7705的高精度信号采集系统设计

基于PIC单片机和AD7705的高精度信号采集系统设计

在工业现场测试过程中,由于生产中的各种参数的测试数据对生产过程具有重要的意义,因此对各种测试数据精度要求较高。而对于传统的传感器,比如压阻式、应变桥式、热电偶、热电阻、电容式以及压电式传感器,输出的一般是毫伏级的微弱模拟信号,温度特性差,而且在传输过程中信噪比明显降低。因此需要设计高精度稳定性...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。