当前位置:首页 > 电子

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

admin7年前 (2020-01-08)电子7839
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 keil mdk启动代码发分析

在启动文件我们看到了__main和用户写的main,这2个是有区别的,大概流程如下: 1、复位第一条指令:Reset_Handler   PROC,这里指定为 LDR     R0, =__main。表示调用库函数__ma…

锂电池充电的原理

锂电池充电的原理

    锂离子电池的充电过程可以分为四个阶段:涓流充电(低压预充)、恒流充电、恒压充电以及充电终止。     锂电池充电器的基本要求是特定的充电电流和充电电压,从而保证电池安全充电。增加其它充电辅助功能…

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

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

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

stc-isp烧录 下载 协议 过程分析

一、数据封装格式 包头 标示 数据包长度 命令字…

正点原子阿波罗ST32F767试用

正点原子阿波罗ST32F767试用

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

如何看懂电路图(二)-电源电路

如何看懂电路图(二)-电源电路

前 面介绍了电路图中的元器件的作用和符号。一张电路图通常有几十乃至几百个,它们的连线纵横交叉,形式变化多端,初学者往往不知道该从什么地方开始, 怎样才能读懂它。其实电子电路本身有很强的规律性,不管多复杂的电路,经过分析可以发现,它是由少数几个单元电路组成的。好象孩子们玩的积木,虽然只有十 来种或二…

发表评论

访客

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