00:00
下面啊,咱们就具体的来介绍这些指令,那咱们介绍的话呢,有不同的维度来进行讲解,那咱们什么意思呢?就是咱们刚才提到这些指令的话呢,一方面根据这个操作码,它是不是有具体的跟这个类型相关,咱们呢,就分成了显示的相关的,隐示的相关的和完全不相关的,这是一个维度,那我如果要讲解这些字节码指令的话呢,一共200来个,那如果我们要是按照abcd的顺序的话呢,也可以是吧,这也是一种维度,但是这两种维度的话呢,我们说都不是特别好。尤其呢,如果我们按照abcd的顺序的话呢,显然有一些呢,我们很少用的,那你可能没讲,哎,这个你给讲啊,然后呢,这个常用的呢,在后边呢,你讲的又比较晚,或者说你没讲到是吧,这就不合适了。另外的话呢,就是有一些指令可能我们不太常见,但是呢,我们通过它的这个里边主要的这个名字,因为这儿呢,我们说通常这些指令呢,咱们都称为呢,叫做助剂符嘛,助剂符注记符就是帮助咱们去记忆的,所以呢,我们看到这里边的一个单词的时候呢,这个单词很大很大程度上就暴露了它的一个主要意思。
01:05
那既然这个意思你大概呢是清楚的,我们就大体上能够确定它的一个功能,所以说呢,这里边儿咱们在讲解的话呢,咱更倾向于是按照这个类型来进行一个划分。啊,那大家呢,看到相应的类型里边有一些指令,可能我们见的比较少,但是呢,你一看那个名字,你就知道它是什么类型的,那相同类型呢,往往它的操作呢,也都是类似的,所以我们这块呢,更适合用类型的维度来进行给大家讲解。好,那首当其冲的话呢,叫做加载与存储指令。那相较于我们下边这样的几类指令来讲,加载与存储指令是我们使用频率最高的。这个呢,就是一个完全的一个统计,从咱们写的代码上,咱们呢,诶翻译成推荐码一看,这个加载存储用的是最多的,所以我们首先来讲它,另外的话呢,就是大家呢,也需要重点掌握的就是它。那加载与存储指令呢,准确的来说呢,是包含两类,包含两类,一类呢就叫做加载,一类呢就叫做存储。
02:02
很显然对吧,那这个主要针对的呢,我们说就是这个战争当中的局部边量表和操作出战,就是将数据从战争的局部边量表和操作战当中,要么呢,把你这个数据给我,要不把我这个数据给你啊,就是来回之间呢,进行数据的一个传递。好,那么如果提到呢,是叫做加载,那如果提到是加载的话呢,咱们主要指的是呢,就把这个数据呢,把它呢压占到操作数站当中。压占到这个操作式站当中啊,那这个压占到操作式站当中,这个数据来自于哪呢?可能来自于局部变量表,也可能来自于常量池,所以这块呢,你看又分成了具体的两类。啊,举体两类,那如果呢,你是把这个数据呢,保存在我们的局部变量表当中,这个咱们就称为呢,叫存储指令,那主要针对是这个第三种,那另外呢,还涉及到局部变量表的一个访问索引的一个指令,叫做we的啊这个咱们用的相对来说少一些啊,那下边呢,就是我们常见的这些指令,咱们呢,先不具体展开来说啊,后边咱们一个一个来讲,那整体上来看的话呢,大家会发现这样一个特点。
03:07
就是如果呢,大家呢,你看到这个单词叫做load啊,我现在一边讲啊,大家呢,就顺便呢,你记一记啊,如果呢,你看到这个单词叫做load,或者叫push,或者叫做这个cost,以及呢叫LDC。凡是你看到这几个单词的话呢,它主要指的呢,都是把这个数据呢,这个压占到这个操作是站当中。哎,都是这个意思,好,那如果说呢,我们看到的是什么呢,叫做store。此道呢叫做存储,那这时候我们相当于是把这个数据呢,要给它保存在战争的局部变量表当中,所以呢,就是相当于是这个操作了。OK吧,行,这个大家你我这块说完之后,你顺便呢,就记一记了,OK,行,然后的话呢,我们再来谈一谈,这里边儿的话呢,就涉及到了我们这些指令呢,可能跟这个数据类型就相关了,对吧,所以这里边儿你看那个X,它不是说有一个类型就是X了,而是具体的表示的就是ILDFA。
04:04
啊,这块我就捡起了啊,Is FDA啊这样,那这个I的话呢,就是我们说的int类型,当然呢,也包括咱们那会儿也提到了,像BAT char short,布尔是吧,像这些类型呢,他们在加载到这个内存中的时候,也是用的一个槽位四个字节。所以说呢,这里边我们也都把它们统一成用一个int来表示,那L呢,就是我们long型的这个长整型占八个字节,F呢,就是浮点型这个四个字节的,然后WD是吧,就是八个字节的这个浮点型,A呢,就是我们说的引用类型,包括数组啊,对象啊,对吧,这样的一些类型,好,这是我们说的这个X的一个介绍,就涉及到了具体的一些类型这块的问题。啊,下边的也类似对吧,也类似啊,嗯,这是一个事儿,然后另外一个呢,就是我们看到会有诶这个下划线N的问题,这个N的话呢,这个有一个具体范围,在我们这里边儿呢,是从零到三,后续我们还会看到类似的这种场景,不一定都是零到三,也都可能零到零到五是吧,还有可能是零一啊这个不一样啊,具体问题具体分析,那这个呢是什么意思呢?咱们在这呢顺便说一下。
05:11
嗯,大家顺便说一下这个,你看这里边提到了,说由于像像这些呢,这个指令来讲,它们表面上没有操作数,这个不需要进行取操作数的动作,但是实际上隐含在这个指令当中了啊说的就是这个事儿,哎,咱们举例子,比如说呢,我现在有一个呢,叫做I漏的下划线零。把这个变大一点。比如说我现在有一个指令叫L的下划线0I,就是操作是int类型对吧,那它是什么意思呢?我们说就是将这个局部哎,变量表中所以为零位置上的数据。哎,位置上的这个数据呢,哎,压占到或者叫压入,哎操作数站。中就这个意思。那举个例子,你比如说咱们之前看的这个at的方法,然后我们看一下它的这个,那最起码这里边这个结构啊,关于这个in code,你看上来就a load0对吧,这个A呢,就表示是引用数据类型,其实上就是。
06:13
这个所以零,所以零位置上的话呢,是不是就这。就它是吧,这个所以上是一个影类型的啊,就是将我们这个缩引为零九倍量表中这个位置上的元素呢,压入到我们的操作站当中,在我们这里边呢,是一个int类型的数据,当然也有可能是这些类型,对吧?好,这是它的意思,然后那对应的呢,还可能会有一个比如叫ILO,我这写一个,我我先写个这样的吧。那这个操作的话呢,它其实表达的跟他就完全是一个意思了。完全是一个意思,只不过的话呢,我们没有必要呢,去使用这一组指令。为啥呢?啊,那大家会发现这呢是一个操作码,这呢是一个操作数,那操作码的话呢,我们说是一个字节,这儿呢操作数通常又是两个字节,那这个是不是意味着你在自解码文件当中就要占三个字节啊,而我们这儿呢,是不是整个就占一个字节啊,那显然这个是不是更节省这个空间对吧,存储的空间啊,那这时候呢,我们就选择用这种方式,但是这时候呢,我们无不能无限制的是造各种各样的下划线,呃三四五六七八九十,那256个情况,二百五六个位置,呃,不同的种类嘛,很快是不是就占满了。
07:22
所以这里边儿呢,我们也只是从概率上来讲,操作的比较多的呢,是下角标零到角标三这样一个范围,所以呢,我们在这个范围内呢,就给了具体的一个具体的操作码,对吧?那如果超出这个范围,比如说我们现在你要取的是这个角标四的位置。角标四的位置,那这时候的话呢,我们就得显示的这样来去定义,而这种方式的话呢,由于你是零,所以我们通常就这样来处理了,哎,就没有具体的这个操作了。啊,这个大家OK是吧,行清楚一下,我们为什么这里边会涉及到这个N有一个具体的范围,为什么要单独的又指定了它啊,而不是呢,加上一个操作码的一个操作数的一个方式,行,那这的话呢,咱们就对这个加载与存储指令呢,先有一个泛泛的一个理解啊,先有一个泛泛的理解。
我来说两句