目录
局部变量压栈指令
将一个局部变量加载到操作数栈:xload、xload_<n>(其中 x 为 i,l,f,d、a;n 为 0 到 3)
以尖括号结尾的(例如 iload_<n>)。这些指令助记符实际上代表了一组指令(例如 iload_ <n> 代表了 iload_ 0、iload_ 1、iload_ 2 和 iload_ 3 这几个指令)。这几组指令都是某个带有一个操作数的通用指令(例如 iload) 的特殊形式,对于这若干组特殊指令来说,它们表面上没有操作数,不需要进行取操作数的动作,但操作数都隐含在指令中
除此之外,它们的语义与原生的通用指令完全一致(例如 iload_ 0 的语义与操作数为 0 时的iload 指令语义完全一致)。在尖括号之间的字母指定了指令隐含操作数的数据类型,<n> 代表非负的整数, <i> 代表是 int 类型数据,<l> 代表 long 类型,<f> 代表 float 类型,<d> 代表 double 类型
操作 byte、char、 short 和 boolean 类型数据时,经常用 int 类型的指令来表示
常量入栈指令
ldc 系列:
接受两个 8 位参数,使用 ldc_w
如果要压入的元素是 long 或者 double 类型的,则使用 ldc2_w 指令
出栈装入局部变量表指令
出栈装入局部变量表指令用于将操作数栈中栈顶元素弹出后,装入局部变量表的指定位置,用于给局部变量赋值
这类指令主要以 store 的形式存在,比如 xstore(x 为 i、 1、f、d、a)、xstore_ n(x 为 i、1、f、d、a, n 为 0 至 3)
其中,指令 istore_ n 将从操作数栈中弹出一个整数,并把它赋值给局部变量索引 n 位置
指令 xstore 由于没有隐含参数信息,故需要提供一个 byte 类型的参数类指定目标局部变量表的位置
一般说来,类似像 store 这样的命令需要带一个参数,用来指明将弹出的元素放在局部变量表的第几个位置。但是,为了尽可能压缩指令大小,使用专门的 istore_ 1 指令表示将弹出的元素放置在局部变量表第 1 个位置。类似的还有 istore_ 0、istore_ 2、 istore_ 3, 它们分别表示从操作数栈顶弹出一个元素,存放在局部变量表第 0、2、3 个位置
由于局部变量表前几个位置总是非常常用,因此这种做法虽然增加了指令数量,但是可以大大压缩生成的字节码的体积。如果局部变量表很大,需要存储的槽位大于 3,那么可以使用 istore 指令,外加一个参数,用来表示需要存放的槽位位置