00:00
那常量入站指令呢,这个三个系列呢,咱们就说到这儿,下边呢,我们看一下叫出站装入局部变量表的这个指令,这个指令的话呢,主要涉及到就是我们将操作数占中占顶元素弹出之后呢,把这个数据呢装入局部变量表。那我们说这一节呢,主要说的呢,叫做加载与存储,加载呢,主要是往这个操作站当中去压站操作是吧,这个去压入这个数据,然后这个存储呢,主要指的就是我们把数据呢,存储在我们局部变量表当中,通常呢,这个数据呢,都是来自于我们说操作数占了,那既然呢是装入局部变量表是一个存储操作,所以我们会看见在这一节当中,这个主要指令呢,就是store,就是存储的意思。所以呢,这一节呢,涉及到这个,呃,指令呢,就比较少一些。那主要呢,其实就是这两种对吧,这两种一种呢,就是后边呢,有一个具体的操作数的这个X呢,代表的又是ifda,这个咱们都已经说过了,然后呢,X到后边有个杠N的这个呢,这个N代表的是零到三中的任何一个值,那么这个N呢,表示的是什么意思呢?这个大家又得是非常小心,咱们刚才讲过的常量入站操作里边的这个I呀等等的,这个它表示的实际上是一个数据。
01:16
对吧,就是一个数是三啊六啊等等是这种数,那我们现在指的这个N呢,是什么呢?注意是一个索引。你看这里边写到的指令S到下划线N指的呢,是从操作数站,操作数站当中啊,弹出一个整数,这个整数呢,就是我们这个I来代表的,对吧?然后把它呢赋给局部变量,所以N的位置,所以这N呢表示的是一个,所以N这个大家要注意,而我们这个如果没有带这个下划线起的呢,这种操作需要我们后边呢,包含一个BAT类型数组所表示的一个,具体那个索引的值是多少对吧?是索引的哪个位置了。啊,就相当于是我们这个指令呢,带一个操作数上面这就不用带了,那这个好处呢,咱们在前面讲局部变量压站指令的时候呢,其实已经说到过这个好处。
02:03
就是带一个这种参数的话呢,我们就直接呢,能够,嗯,像像store这样肯定是需要个参数的,对吧?表明呢,你到底是存在局部变量表中的哪个位置,那这种带下划线具体一个索引位置的这种呢,虽然说增加了指定的数量,但是呢,缩短了我们最起码的一个体积,这个好处呢,咱们前面说过了,都很清楚,好,那下边呢,咱们主要呢,就是通过一个例子呢,来给大家做一个说明。这呢,我们列一个例子呢,叫做store,这有一个K,有一个D,这是我们的行参,然后在这个方法体内中,我们又定义了其他的一些这个变量,那整个呢,关于它的一个执行情况,我们做一个编译。然后这块呢,我们再做一个show行这块我们主要看的就是这个store,把这个code呢,这块打开以后,整体把它CTRLC咱们粘一下,然后粘到咱们这块,咱们在第二个这里边儿呢,来进行一个说明。可以了。行,这个我们把它再放大一点。
03:03
行,然后对应的这个代码呢,咱们也给他盯一下。好,那下面呢,咱们来做一个分析,首先呢,这块呢叫I漏的下划线一,这个漏呢,咱们在前面已经讲过了,是不是就加载的一个操作对吧?这个加载呢,指的是我们往这个操作站这块呢去做一个加载,这个首先的话呢,我们先看一下这个局部变量表,我们这个方法这块呢,一上来声明完以后,对于一个非静态的方法,我们这里边已经会有一些结构了,对吧,第一个呢就是Z4,第二的话呢,就是我们定义的这个K,然后第三个呢,就是这个D。注意,我这块写的是这个变量名,实际上我们这块存的呢,不是这个变量名,咱们存的是具体的一个数据值,这个大家注意一下,因为现在咱们还没有调这个方法,所以具体一个K是几呢,咱们就没没法确定了,甚至你调它的时候呢,比如说负的值是一,那这个位置放在值就是一,这要注意啊,我现在这块呢,写的是变量名,实际上这块存的就是具体的数据值。
04:02
那么接下来的话呢,我们看到这个叫ILO的下划线一,它的意思呢,是一个int类型的,是一个加载操作一呢,就是索引一,相当于把这个数据呢,从我们的这个局部变量表是不是加载到咱们这个操作数栈当中,对吧?那这时候相当于是这个K就过来了。对吧,K就过来了,其实这块过来的也是K的值,大家注意我们操作站里边存的也是值,不是这个变量啊,这个大家小心。然后呢,我们又定义了一个cost,就是一个常量,这个呢是二,注意这个二呢指的是数据值是二,嗯,那直接呢,就进咱们这个操作站就完了,这个值是不是二啊。这个我们给它都向右对齐吧。居中对齐吧。行,然后这个是二,然后接下来的话呢,有一个IAI呢,这是咱们下边要讲的这个算术的指令,就指的是做和的意思,那相当于这里边这个二跟那个K呢,他俩就都得出战,都出战以后呢,做一个和。
05:04
嗯,做一个和,那其实这块我我我我暂时这块就不给他删了啊,其实这块操作完以后,这俩就都出站了,出站完以后呢,然后接下来K加二这个值,嗯,这块我们又呃得存到这个操作站里边,就是它俩这个ii的这个操作它俩都出。两个值,两个值都出,出完以后呢,把和计算一下,然后再放到我们这个站里边,我就暂时写到这儿了,实际上呢,这个是应该就是把它俩干掉之后,这个K加二要放在这儿了啊,这个大家注意,我这块就保留这个过程了算是。再接下来的话呢,把你得到的这个操作数站里边的这个数据叫I到四,这个I到四的就是把这个数距离算的是几,放到我们这个里边叫做角标四的位置,那角标三这块怎么没有放呢?大家也注意我们这个这个角标二的这个位置呢,你看是个W类型,它是不是这个槽位呢,也都占占了对吧?所以这块呢,整个应该是长这样子了,它占两个槽位,然后这个结果的话呢,咱们是不是这个起个名字叫M对吧。
06:03
还是那意思,咱们这个放的不是变量名,是你这个真正的这个K的一个值加上二之后呢,这个数据放在这儿,注意啊,放在这儿行,那这呢,我们这个操作在接下来的话呢,我们有一个l DC two啊,这是一个二杠W啊,这呢提到我们引入这个常量池当中的这个索引为13的这样的一个数据,对应的这个值呢,实际上是12,咱们已经看到了啊,我就不看常量池力了。这个12的话呢,是我们把它加载到咱们这个位置,是不是这就12啊。没问题对吧,加在这之后呢,然后是一个L4到五,把这个值呢,现在往这放,放到这个五的位置,嗯,这个咱们其实是这个L了,这个我还是写它了啊,其实这块呢,过来就是12。这个放12啊,这个注意行,那这个呢就放在这儿了,然后再往下的话呢,LDC这个DC呢,它这块对应的是一个字符串,嗯,找常量池,所以为15这个位置是艾特硅骨,把它呢放在这儿,那就at。
07:02
硅谷对吧,当然了,这块注意我们这块放在这数据,实际上每次像这个12刚才用完之后呢,这个里边占中就没有数据了,还是放在最下边这块,小心一下这个事儿,我只是把这个过程都保留下来了,所以看着好像都往上垒,其实呢,这里边我们现在放在这个底这块啊。A5放在这儿了,这就是对应的我们这一行,再往下的话呢,叫a store7,这个A呢,表示的就是我们这里边是一个死砖类型,是一个对象类型的,这个七呢,就是我们的索引七的位置,咱们现在说存储,它表示的是这个索引位置,那这个六这块呢,又因为我们这是个long类型嘛,它又占两个槽位嘛,是这意思吧,所以在这个位置呢,咱们放的就是这个爱的硅谷,爱硅谷就放这儿了。我这样跟跟前面统一吧,咱们都写成个变量名了,注意是把阿硅谷放这儿。注意啊,哎,硅谷在这儿呢,然后的话呢。下边又有一个叫f store啊在这呢啊LDC,然后这个常量池中,嗯,所引为16的这个位置,那你一看的话呢,这个值是十,那我就不去看了啊,这个10.0,把这10.0呢,也放到我们这个位置,那就是10.0,然后这个呢就完事。
08:11
接下来的话呢,我们把这个数据这个10.0,咱们改一下它的。单元格格式。这是可以包含这个小数点的,对吧。10.0,哎,整了两瓶。这样没?但这个10.0的话呢,现在咱们把它呢,接下来通过这样的一个操作,是不是就放到我们的这个索引为八的这个位置的,就在这儿呗,那这块呢,就写上这个10.0,其实啊,我还是为了统一,咱就把F我就写这了,就这对应的是咱们这个操作。没问题对吧,然后再往下的话呢,这块再看LDCR这个下划线W,嗯,这个操作呢,又往这里边儿去放个数据,放在什么呢?也是10.0,那10.0那就往这放呗。
09:06
啊,这个10.0,我就这样复制一份得了,还是个10.0行保存到这儿,那这个时候呢,我们是一个l DC two l DC two,嗯,这个呢,咱们是一个W型的,对吧,咱们刚才讲这块的时候呢,大大家忘了再看一眼啊,针对于这个。嗯,针对于这块啊,针对于你是个long类型或者double类型,咱们这块有这个图,你要是个float的类型的话呢,直接是LDC,所以呢,你看咱们刚才虽然呢都是10.0,但是刚才这个你上边这呢是一个float的类型,所以它这块呢是LDC,但是你下边这个10.0的话呢,这个10.0它是一个W型了,所以是ldc two。这个要注意。然后呢,这个是10.0,把这个值呢,是一个大部类型的保存在我们的索引为二的这个位置,索引为二就这个位置嘛,把这个值这个一开始我们在调这个方法的时候呢,它可能会有一个值,这个值呢,比如说1.0,然后呢,咱们拿这个10.0是不是替换了这个,原来这个1.0就可以了,对吧,那替换完以后呢,整个这个方法就结束了,后边这块涉及到一个方法的返回这个咱们呢,下边这个指令里边会有。
10:11
这个方法呢,当没有任何的这个强烈要求,就是明确指明你返回的类型的时候,我们每一个方法最后呢,都是叫做return。再说一遍,当每一个方法呢,呃,反问类型是word的时候呢,它最后呢,会有一个指令叫做return,那如果有具体的反问类型,这个咱们到下边的时候呢,具体再说。行,那这样的话呢,我们就把这个图呢就画完了,注意再强调一遍哈,啰嗦一下,咱这里边放的都是数据啊,因为这呢咱们没有调顶方法,具体一个数值是几不知道,所以这块呢,我就写的是一些变量,这个大家要小心一点,另外这块的话呢,当我们把操作数占中这个数据呢,放到咱们局变量表的时候呢,这里边这个数据就没有了,但是这块呢,我保留这个过程了,所以这些数据呢,是依次往上累加啊,你别这块一看,所以这边不对呀,呃,这块是写的这样不合适,因为呢,去掉之后呢,作为过程出现呢,有些数据你就看不见了,被覆盖了啊,这个大家小心一下。
11:05
好,这个呢,就是咱们说的这个关于把这个数据呢,保存在咱们的局部变量表中这样的一个操作。然后我这下边呢,还写了一个方法,这个方法呢叫做fo,咱们把这个呢看一下。啊,这块我做个刷新,这个fo的话呢,我们这个code看一下,这里边这个bad code里边就有这样的几行指令,对吧?我们先来看一下什么呢?这个局部变量表,这个局部变量表首先呢,你是一个非静态的方法,所以呢,这里索引零就是个Z对吧,那索引一的话呢,这我们对应的是个long没问题,然后因为浪呢占两个槽位嘛,所以这个float的话呢,就从这个索引三开始了。啊,这是它,然后再往下的话呢,大家会发现没有列了对吧,没有给我们列举出来,那因为呢,咱们这个方法体里边呢,这个代码块执行完以后呢,这个结构就相当于作用率就消失了,下边这个呢,又复用的前面这个,所以导致呢,我们这个槽位你看现在没有给咱们显示,但是这块你注意,虽然这块呢显示的013这个float也是占一个槽位,但是呢,你这块看一下咱们的。
12:09
这个最大的局部变量表,它的这个长度是不是写的是五啊。对吧,长的是五,那就意味着呢,咱们后边应该还是得有一个四的,是不是零到四就是五个嘛,嗯,因为咱们毕竟还是要存这个I的啊,这个大家要稍微小心一点,这个事儿,那我们来看一下这里边这个具体的执行,首先呢,我就在这画一个简图了,这呢是咱们这个操作数站,这个呢是咱们这个局变量表,首先这块呢,我们定义了一个常量零,把它呢放在这儿。然后把它呢,存储在我们这个I到这个四的这个位置,那前面三个呢,第一个刚才说了是这个Z,第二呢是这个long占两个槽位,它自己一个这个这个两个槽位,然后下边这个索引为三的这个位置呢,是一个float型的这个F,然后这个这个都是数据啊,这个这次这块呢,也是你当前这个对象,嗯,这个都是数据,然后呢,这个零的话呢,把它拿过来相当于放在这儿呗。
13:03
这个呢,其实就是我们对这个ID这个值,它其实就站在这儿了,接着呢就是当我们这个大括号执行完以后,下边呢,又有一个大括号一进入,这时候呢,你看我们首先呢,声明了一个叫hello word l TC就放在这hello word,然后接下来呢,A store4,这个A呢,就是我们说的引用类型,把它放在我们这个四的位置,相当于把这块拿过来,这个从零给它抹掉,换成了叫hello word。就这样个信息,那整个呢,我们说这个九变量表最大的深度,这不就从零到四一共是五个吗。OK吧,就相当于这里边儿涉及到了,就是我们对于这个槽位的数据的一个复用问题。啊,应该能理解,行这儿呢,就是咱们说的这个关于出站装入局部变量表的这个指令。啊,那整个呢,这里边我们关于这个加载与存储指令呢,就说到这儿,当然呢,就是按照我们这些指令的这个规律,像漏的那就是往站里边放,然后下边这个这个push啊,Cost呀,LTC啊都是,只不过这里边儿涉及到角标的话呢,这个不是角标了,这个实际上是具体的数据,这个呢是角标对吧,然后在咱们这个。
14:09
这个装入局变量表的时候呢,这也是这个校标,这个呢,我们往局变量装,局部变量表中装呢,叫store,这个大家呢,听完这个以后呢,你就把它记下来。这个呢咱们比较常见,好这呢,我们就整个呢说到这儿。
我来说两句