函数指针执行机器指令

  函数指针就是一个指向函数的指针,关于c的忘的差不多了,需要补下。因为jvm执行字节码(模板解释器)主要就是通过函数指针来实现的。字节码属于栈指令,我们的机器可以直接执行的是机器指令,栈指令是不能在机器上直接执行的,要执行归根都会要变为机器指令来执行。
  这里来弄下通过函数指针执行机器指令的demo,因为课本上很少有见到介绍这个的。没什么事谁会放着高级语言不用而去弄机器指令呢,主要是感性的认识 下。代码就是这样了,code字符数组里面存放的就是机器指令的十六进制,而它的逻辑就是被注释的add方法。

#include <stdio.h>

const unsigned char code[] = "\x55\x48\x89\xe5\x89\x7d\xfc\x89\x75\xf8\x8b\x45\xf8\x8b\x55\xfc\x01\xd0\x5d\xc3";

//int add(int a, int b){
//return a + b ;
//}

int main(){
    int a = 5;
    int b = 3;
    int (*fun) (int,int);
    fun=(void*)code;
    int r = fun(a,b);
    printf("r = %d\n",r);
    return 0;
}

  怎么获取add方法对应的机器指令?通过 objdump -d ××× ,可以获取到数据了。
这里写图片描述
  中间那块就是机器指令了,最右边是汇编指令。把机器指令拷进去就可以执行了,神奇吧。jvm里模板解释器会将字节码文件解释为机器指令,然后通过函数指针的方式来执行相关的机器指令。为啥叫模板解释器呢,因为每个字节码会对应一个模板方法,方法里面有相关的机器指令。还有一个叫字节码解释器的,就是通过c语言来执行字节码,这种方式性能比较差,所以后来jvm默认使用模板解释器来执行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值