4.JVM机器指令集
机器指令 | 汇编语言 | 解释 | 对栈帧的影响 |
0x12 0x10 | ldc #16 |
将常量池中第16个常量池项引用推到操作数栈栈顶。 常量池第16项是CONSTANT_UTF-8_INFO项,表示”Louis”字符串 |
|
0x4c | astore_1 |
操作数栈的栈顶元素出栈,将栈顶元素的值赋给index=1 的局部变量表元素上。 这里等价于:name = “Louis”. |
|
0x2b | aload_1 | 将局部变量表中index=1的元素的值推到操作数栈栈顶 |
|
0xb8 0x20 0x12 | invokestatic #18 |
0xb8表示机器指令invokestatic,操作数是0x20 << 8| 0x12 = 18,操作数18表示指向常量池第18项,该项是main方法的符号引用: org/louis/jvm/codeset/Bootstrap.greeting:(Ljava/lang/String;)V 当JVM执行这条语句的时候,会做以下几件事: a).方法符号引用校验。会校验这个方法的符号引用,按照这个符号规则 在常量池中查找是否有这个方法的定义,如果找到了此方法的定义,则表示解析成功。如果是方法 greeting:(Ljava/lang/String;)V 没有找到,JVM会抛出错误NoSuchMethodError b).为新的方法调用创建新的栈帧。然后JVM会为此方法greeting创建一个新的栈帧(VM stack),并根据greeting中操作数栈的大小和局部变量的数量分别创建相应大小的操作数栈;然后将此栈帧推到虚拟机栈的栈顶。 c).更新PC指令计数器的值。将当前PC程序计数器的值记录到greeting栈帧中,当greeting执行完成后,以便恢复PC值。更新PC的值,使下一条执行的指令地址指向greeting方法的指令开始部分。 这条语句会使当前的main方法执行暂停,使JVM进入对greeting方法的执行当中当greeting方法执行完成后,才会恢复PC程序计数器的值指向当前下一条指令。 |
|
0xb1 | return | 返回 | |
机器指令 | 汇编语言 | 解释 | 对栈帧的影响 |
0x12 0x10 | ldc #16 |
将常量池中第16个常量池项引用推到操作数栈栈顶。 常量池第16项是CONSTANT_UTF-8_INFO项,表示”Louis”字符串 |
|
0x4c | astore_1 |
操作数栈的栈顶元素出栈,将栈顶元素的值赋给index=1 的局部变量表元素上。 这里等价于:name = “Louis”. |
|
0x2b | aload_1 | 将局部变量表中index=1的元素的值推到操作数栈栈顶 |
|
0xb8 0x20 0x12 | invokestatic #18 |
0xb8表示机器指令invokestatic,操作数是0x20 << 8| 0x12 = 18,操作数18表示指向常量池第18项,该项是main方法的符号引用: org/louis/jvm/codeset/Bootstrap.greeting:(Ljava/lang/String;)V 当JVM执行这条语句的时候,会做以下几件事: a).方法符号引用校验。会校验这个方法的符号引用,按照这个符号规则 在常量池中查找是否有这个方法的定义,如果找到了此方法的定义,则表示解析成功。如果是方法 greeting:(Ljava/lang/String;)V 没有找到,JVM会抛出错误NoSuchMethodError b).为新的方法调用创建新的栈帧。然后JVM会为此方法greeting创建一个新的栈帧(VM stack),并根据greeting中操作数栈的大小和局部变量的数量分别创建相应大小的操作数栈;然后将此栈帧推到虚拟机栈的栈顶。 c).更新PC指令计数器的值。将当前PC程序计数器的值记录到greeting栈帧中,当greeting执行完成后,以便恢复PC值。更新PC的值,使下一条执行的指令地址指向greeting方法的指令开始部分。 这条语句会使当前的main方法执行暂停,使JVM进入对greeting方法的执行当中当greeting方法执行完成后,才会恢复PC程序计数器的值指向当前下一条指令。 |
|
0xb1 | return | 返回 | |