天天看點

jvm執行java位元組碼的C代碼原理

1、實際上就是讓某個函數指針指向一堆已經翻譯好的機器碼,然後執行該函數。

#include <stdio.h>

/**
* code資料中儲存的一串資料,正好是機器碼指令編碼,CPU可以直接執行
* (1)對于計算機,一個資料既可以當作指令執行,也可以被當做一個資料
* (2)當這個資料被CS:IP段寄存器指向時,就可以當做代碼執行
**/
const unsigned char code[]="\x55\x89\xe5\x86\x45\x0c\x8b\x55\x08\x01\xd0\x5d\xc3";

int main(){

    int a=5;
    int b=3;
    int (*fun)(int,int);//定義函數指針
    fun=(void*)code;//初始化函數指針,将其指向code機器碼的入口 

    int r=fun(a,b);
    printf("r=%d\n",r);
    return 0;
}
           

2、code機器碼對應的彙編代碼如下

55               push   %ebp
89 e5            mov    %esp,%ebp
8b 45 0c         mov    0xc(%ebp),%eax
8b 55 08         mov    0x8(%ebp),%edx
01 d0            add    %edx,%eax
5d               pop    %ebp
c3               ret
         
           
jvm