让你的JVM支持流程控制
1、原生语言是如何实现流程控制的
1、cmp指令进行比较。EFLags寄存器 状态寄存器 zf=1
2、jle 短跳指令 挑
2、JVM如何实现流程控制
借助栈来实现的
3、相关指令详解
4、逻辑运算符如何实现
5、增强for循环如何实现
6、JVM中的数组是如何实现的
if
while
1、探讨两个int的比较
每一种比较运算符对应一个特定的字节码指令
System.out.println(a == 0); ifne 专属指令 只占用一个插槽
0 iconst_0
1 istore_1
2 getstatic #2
5 iload_1
6 ifne 13 (+7)
9 iconst_1
10 goto 14 (+4)
13 iconst_0
14 invokevirtual #3
————————————————————————————————-
System.out.println(0 == a); if_icmpne 通用指令 占用两个slot
17 getstatic #2
20 iconst_0
21 iload_1
22 if_icmpne 29 (+7)
25 iconst_1
26 goto 30 (+4)
29 iconst_0
30 invokevirtual #3
33 return
2、int与0的比较:
1、有专属指令的
2、与顺序是有关系的
3、其他数据类型的比较
byte、char……
1、与int截然不同。跟原生的关系运算符的逻辑有点像
fcmpl
ifne 字节码指令的index
4、引用的比较
5、引用与null
条件判断
循环结构
数据的实现
增强for循环如何实现
code.inc(operand - 1 - 2);
为什么要-1,-2
6 ifne 13 (+7)
从程序的运行角度触发
==
!=
1B
255个
拓展指令 wide
汇编指令 拓展指令:二级指令,三级指令
逻辑运算符
&&
||
本质就是控制什么时候跳转
数组
list
判断某个index是否存在
0 iconst_2
数组长度
1 newarray 8 (byte)
3 dup
4 iconst_0
5 iconst_1
6 bastore 数组赋值
7 dup
8 iconst_1
9 iconst_2
10 bastore
11 astore_0
—————————————
12 aload_0
13 astore_1
——————-
14 aload_1
15 arraylength
16 istore_2
17 iconst_0
18 istore_3
19 iload_3
20 iload_2
21 if_icmpge 43 (+22)
24 aload_1
25 iload_3
26 baload
27 istore 4
29 getstatic #3
32 iload 4
34 invokevirtual #4
37 iinc 3 by 1
40 goto 19 (-21)
43 return