让你的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