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

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

admin5年前 (2020-01-08)电子6174
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语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行” 的相关文章

labVIEW调用C# dll 步骤

labVIEW调用C# dll 步骤

labVIEW选用的版本是2010,C#选用的是VS20101.打开VS 2010,选择 文件》新建》项目 如下图所示:图12.输入名称并点击确认,如下图所示图23.编辑类,简单的编辑一个加法,如下图所示:图34.点击 项目》ClassLibrary 属性,如下图所示:图4图65.点击解决方案管理器...

STM32 keil mdk启动代码发分析

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

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

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

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

开关电源拓扑结构概述(降压,升压,反激、正激)

开关电源拓扑结构概述(降压,升压,反激、正激)

主回路—开关电源中,功率电流流经的通路。主回路一般包含了开关电源中的开关器件、储能器件、脉冲变压器、滤波器、输出整流器、等所有功率器件,以及供电输入端和负载端。   开关电源(直流变换器)的类型很多,在研究开发或者维修电源系统时,全面了解开关电源主回路的...

单片机时钟周期,机器周期,指令周期的区别

单片机时钟周期,机器周期,指令周期的区别

时钟周期        时钟周期也称为振荡周期,定义为时钟脉冲的倒数(时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时钟周期就是1/12us),是计算机中的最基本的、最小的时间单位。       在一...

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

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

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

发表评论

访客

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