java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...
1、方法一
要對絕對地址0x100000賦值,我們可以用
(unsigned int ?* ) 0x100000 = 1234;
那么要是想讓程序跳轉(zhuǎn)到絕對地址是0x100000去執(zhí)行,應(yīng)該怎么做?
*((void (*)( ))0x100000 ) ( );
首先要將0x100000強制轉(zhuǎn)換成函數(shù)指針,即:
(void (*)())0x100000
然后再調(diào)用它:
*((void (*)())0x100000)();
用typedef可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
又如
如果用 C 語言,可以像下列示例代碼這樣來調(diào)用內(nèi)核:
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 是內(nèi)核在系統(tǒng)內(nèi)存中的第一條指令的地址。
2、方法二
C語言使用函數(shù)指針跳轉(zhuǎn)到程序固定地址(0x8000)執(zhí)行程序的方法
使用函數(shù)指針,把一個純數(shù)據(jù)強制轉(zhuǎn)換為函數(shù)指針類型。
int main(void)
{
void (* my_function)(void);
//int *my_address = 0x8000;
my_function =(void (*)())(0x8000);
my_function();
}
其實更簡單,不適用中間變量,直接一步到位:
(*(void(*)())0x8000)();
---------------------
總結(jié)
以上是生活随笔為你收集整理的java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚麻籽油多少钱啊?
- 下一篇: jeecgboot前端开发_一款基于代码