一 控制转移指令
比较指令
lcmp 比较 long 类型值
fcmpl 比较 float 类型值(当遇到NaN时,返回-1)
fcmpg 比较 float 类型值(当遇到NaN时,返回1)
dcmpl 比较 double 类型值(当遇到NaN时,返回-1)
dcmpg 比较 double 类型值(当遇到NaN时,返回1)
条件分支指令
ifeq 如果等于0,则跳转
ifne 如果不等于0,则跳转
iflt 如果小于0,则跳转
ifle 如果小于等于0,则跳转
ifgt 如果大于0,则跳转
ifge 如果大于等于0,则跳转
ifnull 为 null 时跳转
ifnonnull 不为 null 时跳转
比较条件分支指令
if_icmpeq 如果两个 int 值相等,则跳转
if_icmpne 如果两个 int 类型值不相等,则跳转
if_icmplt 如果一个 int 类型值小于另外一个 int 类型值,则跳转
if_icmple 如果一个 int 类型值小于或者等于另外一个 int 类型值,则跳转
if_icmpgt 如果一个 int 类型值大于另外一个 int 类型值,则跳转
if_icmpge 如果一个 int 类型值大于或者等于另外一个 int 类型值,则跳转
ifnull 如果等于null,则跳转
ifnonnull 如果不等于null,则跳转
if_acmpeq 如果两个对象引用相等,则跳转
if_acmpne 如果两个对象引用不相等,则跳转
多条件分支跳转指令
tableswitch 通过索引访问跳转表,并跳转
lookupswitch 通过键值匹配访问跳转表,并执行跳转操作
无条件跳转指令
goto 无条件跳转
goto_w 无条件跳转(宽索引)
二 比较指令
比较指令的作用是比较占栈顶两个元素的大小,并将比较结果入栽。
比较指令有: dcmpg、dcmpl、fcmpg、fcmpl、lcmp
首字符 d 表示 double 类型,f 表示 float,l 表示 long
对于 double 和 float 类型的数字,由于 NaN 的存在,各有两个版本的比较指令。以 float 为例,有 fcmpg 和 fcmpl 两个指令,它们的区别在于在数字比较时,若遇到 NaN 值,处理结果不同。
指令 dcmpl 和 dcmpg 也是类似的,根据其命名可以推测其含义,在此不再赘述。
举例
指令 fcmp 和 fcmpl 都从操作数栈中弹出两个操作数,并将它们做比较,设栈顶的元素为 v2 ,顶顺位第2位的元素为 v1,若 v1 = v2 ,则压入0,若 v1 > v2 则压入1,若 v1 < v2 则压入 -1。
两个指令的不同之处在于,如果遇到NaN值, fcmpg会压入1,而fcmpl会压入-1
三 条件跳转指令
< | <= | == | != | >= | > | null | not null |
iflt | ifle | ifeq | ifng | ifge | ifgt | ifnull | ifnonnull |
四 比较条件跳转指令
< | <= | == | != | >= | > |
if_icmplt | if_icmple | if_icmpeq、if_acmpeq | if_icmpne、if_acmpne | if_icmpge | if_icmpgt |