1.函数调用指令集
x86 cpu 函数调用指令集 call ret 主要作用是保存现场和恢复现场,比如 cpu 寄存器压栈和弹栈;
jvm 函数调用指令集 invokevirtual invokeinterface invokespecial invokestatic return .. 等等,由于 jvm 没有物理寄存器,而是用操作数栈和pc寄存器来替代,jvm 保存现场和恢复现场的解决方案是压一个栈帧 入 java栈,函数返回的时候弹出从 java栈中弹出一个栈帧;因为 java 的代码是以类中的函数为单位进行代码块的管理,所以调用函数的时候,jvm 不能和 x86 一样,直接跳转就能找到对应的代码块,而 jvm 需要一些列根据对象、类、结构、函数等相关数据单元提供的引用信息来查找要调用的函数的对应的代码块在那里。并且这个特性造成 jvm 中的跳转等指令只能函数内跳转,并且一个函数的代码是用 code[] 来管理,跳转需要地址只需要是这个 code[] 的索引。
2,.数据交换
jvm 内部数据存储区,大概可以分为 操作数栈、局部变量表、java 堆、方法区中类的常量池,而 x86 等 cpu 一般有 cpu 内部的寄存器、内存的数据区、内存中的栈、内存中的代码段等地方,jvm 的所有运算只能在 操作数栈 中进行( iinc 指令除外,他们可以直接对局部变量进行运算), x86 cpu 所有的运算只能在 cpu 内部寄存器中进行,所以除了这些部件之间的必要的数据交换,所有要运算的数据也必须转移到 jvm 操作数栈、x86 cpu 寄存器 然后才能进行运算,之后再把结果转移回去。
jvm 为 操作数栈 和 局部变量表 之间数据交换设计了专门的指