Java字节码与X86汇编的对比

Java字节码与X86汇编的对比

相同之处

  • Java字节码解释运行时与X86汇编一样,都使用了函数栈幁模型 具体参考我之前的博文 如何在用户态完成一次上下文切换 里面有对X86函数栈幁模型有一个较为简单的介绍

  • 字节码跟X86汇编均提供程序流程结构控制,例如Java字节码 提供 条件跳转指令如:if_icmpge 无条件跳转指令如:goto等字节码指令来完成程序的逻辑控制,在汇编中提供条件跳转指令如:jne 无条件跳转指令:jmp

不同之处

  • 字节码无法直接操作内存控制栈幁结构,X64汇编需要手动通过操作rsp rbp 寄存器维护栈幁结构

  • 字节码通过 操作数栈 (操作数栈跟栈幁是两回事) 来完成函数传参与函数结果值的返回,操作数同样也会通过 操作数栈 来计算结果, 汇编通过寄存器传参数 例如fastcall 使用 rdi 寄存器作为函数的第一个参数的存放位置,通过rax寄存器返回函数的结果

总结

  • Java字节码 通过操作数栈屏蔽了 各个平台的差异 (例如 x86与arm的寄存器名称不同),兼容性好,但是同时字节码的解释运行,需要频繁操作函数栈帧中的操作数栈,操作数栈由于其存放位置在主存(可能各个虚拟机的实现不同,存在一些优化),即使操作数栈的数据被L1 cache缓存命中,但寄存器读取的速度也比L1 cache的快上好几倍。

参考

(基于栈的指令集与基于寄存器的指令集的区别)[https://zhuanlan.zhihu.com/p/93687325]

posted @ 2021-01-22 11:36  Richard_Winters  阅读(308)  评论(0编辑  收藏  举报