二、Java虚拟机(JVM)中常见的汇编指令(笔记)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/QQB67G8COM/article/details/81810941

大部分机器指令集都支持一下5类计算:

汇编语言本来就是机器指令的助记符

EAX:

EAX也是一种32位通用寄存器。 EAX寄存器称为累加器,AX寄存器是算术运算的主要寄存器,所有的输入、输出只使用AL或AX人作为数据寄存器。在80386及其以上的微处理器中,EAX寄存器可以用来存储单元的偏移地址。

EBX:

EBX 是”基地址”(base)寄存器, 在内存寻址时存放基地址.
EBX寄存器
EBX 是”基地址”(base)寄存器, 在内存寻址时存放基地址。
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。

常见汇编指令

1、数据传输指令(任何硬件系统都必须支持的指令)

主要在寄存器与内存、寄存器与输入/输出端口之间传送数据
mov1 1, %eax //将自然数1传送到eax寄存器
pop %eax //将栈顶数据弹出至eax寄存器

2、算术运算指令

包括算术基本四则运算、浮点运算、数学运算(正弦、余弦)等。
//将自然数3与eax寄存器中的数累加,并将结果存储进eax中
add 3, %eax

//对于ebx寄存器中的数增1
inc %ebx

3、逻辑运算指令

与、或、非、左移、右移等指令,都属于逻辑运算指令
shl %eax, 1 //将eax中的数左移1个二进位
and a1, 00111011B //对a1寄存器中的数和操作数进行与操作

4、串指令

连续空间分配,连续空间取值,传送等,都要使用串指令。

5、程序转移指令

If···else判断、for循环、while循环、函数调用等都需要依赖程序转移指令,否则无法跳转。没有这些指令,程序不能模块化,无法被分割成一个个方法,也不存在循环操作。
常见的程序转移指令包括jmp跳转、loop循环、ret等。

JVM指令

1、数据交换指令

JVM内存分为操作数栈、局部变量表、Java堆、常量池、方法区。
数据交换指令支持数据在这些内存区域之间的传送和交换。
Java方法中访问一个静态变量时其运算过程必然伴随JVM将数据从常量池传送到操作数栈的指令调用。
JVM执行逻辑运算的主战场是操作数栈。
x86硬件平台上直接执行的程序,其内存一般分为寄存器、数据段、堆栈、常量区、代码段,CPU为了完成运算必然会涉及将这些内存区域的数据传送到寄存器的指令调用。
数据交换指令,栗子:iload,istore,iload,lstore,fload,fstore,dload,dstore,ldc,bipush等指令。

2、函数调用指令(属于程序转移指令)

栗子:invokevirtual、invokeinterface、invokespecial、invokestatic 和 return
x86中主要使用call指令和ret指令来保存现场和恢复现场,这往往会伴随CPU物理寄存器入栈和出栈。
JVM没有物理寄存器,用操作数栈和PC寄存器来代替。
JVM保存现场和恢复现场的解决方案是向Java堆栈中压入一个栈帧,函数返回的时候从Java堆栈中弹出一个栈帧。
Java函数的代码没有被放到代码段中,而是被放到一个code缓存中,每一个Java函数的代码块在这个code缓存中都会有一个索引位置,最终JVM回跳转到这个索引位置处执行Java函数调用。
Java函数一定是封装在类中的,因此JVM在执行函数调用的时候还需要通过类寻址等一系列运算,最终才能找到这个入口。

3、运算指令集

JVM和运算相关的指令集主要有算术运算、位运算、比较运算、逻辑运算等,JVM还为各种基本类型的运算提供不同的操作码;
x86和运算相关的指令集:算术运算、位运算、比较运算、逻辑运算。
所有的运算操作都是直接针对寄存器中的二进制数进行的,不区分数据类型。
JVM规范中常见的运算指令:iadd(对两个int型数据求和)、isub(对两个int型数据做减法)、fadd(对两个float浮点数进行求和)、ddiv(两个double双精度型数据相除)等。

4、控制转移指令

JVM规范提供的常见的控制转移指令:switch分支选择指令、if···else条件指令、do···while循环、for循环、foreach循环、return返回、break中断循环、continue继续循环。

5、对象创建与类型转移指令

作为一门面向对象的语言,JVM规范自然要提供一套创建对象的指令。在Java语法层使用关键字new可以实例化一个对象,而对应的字节码指令也是new。
JVM规范还提供了“窄化类型转换”指令”,与之对应的是“宽化类型转换”,还有其他的例如抛出异常指令,线程同步指令等

以上为JVM最核心的部分——run engine(执行引擎)

猜你喜欢

转载自blog.csdn.net/QQB67G8COM/article/details/81810941