00:00
那接着呀,咱们再来看下一组指令,叫做操作数站管理指令,那我们前面这块呢,其实好多指令都是针对于操作站来操作的,那怎么现在又整了一个叫操作扇管理指令呢?就是我们这里边的一个操作啊,不需要借助于说我们通过对象啊,叫属性啊,这个对象调方法呀等等,就是借助一些外部的一些啊,包括类型转换呀这样一些结构,那我们直接呢,就针对于咱们操作入站直接来进行一个管理啊,就是专门的一波操作呢,这个操作入站的这样的一波操作。啊,一说还是有点绕是吧,当然呢,直接来看就知道了啊,那这些指令包括哪些呢?就是我们直接针对于咱们的操作数站,比如说把它这个占顶的一个呢,或者是两个元素给它这个弹出,啊弹出呢就直接discard了,或者叫depreated对吧,就抛废弃了不要了,那这叫pop和pop two这两个的主要区别呢,就是这呢是弹出这个战警的一个元素,这呢弹出两个元素,当然我这里说的这个两个元素,呃,应该这样来理解,就是准确的来讲的话呢,我们是弹出一个slot,就是四个字节的,那这个呢叫pop,你要是弹出两个slot呢,就是pop to,或者说呢,我们弹出一个,呃,Double类型的,或者一个long类型的也可以,那也得用这个叫泡醋。
01:14
质量指的叫弹出的一个意思啊OK,那这个关于复制这一块的话呢,我们提到了有这样的一些。复制这一块呢,稍微的复杂一点,有这个,呃,这个整个这单词呢,叫double k对吧,这叫Du,还有double two,还有Du呢,有个叉一,这个double two,叉一大呢叉二,还有大兔呢叉二这一看有点懵是吧?哎,那这几个的话呢,我们来做一个介绍。这节要介绍的话呢,我们就得看一下这块操作,首先来说呢,是比较简单的,就是不带这个杠X的,这个呢,就是一个复制操作,那带这个杠X呢,它表示的是一个就是除了复制之外呢,还涉及到一个叫插入的一个操作。行,那我们来看一下这个直接复制,直接复制的话呢,如果我们直接呢,是叫dop,叫dump,它呢就相当于是复制四个字节的。
02:02
也就是我们所谓的一个slot了,对吧,比如说你是一个in特呀,一个reference呢,一个这个float呀都可以,这直接呢就叫大,他那尤其是我们大的比较多的呢,就是这个reference的情况啊,比较多的是这种情况,然后double two的话呢,这个呢,主要呢,就是我们要复制两个slot,比如说我们复制一个long类型,这个一个double类型,或者说呢,我们想复制两个int型,或者是这个一的int型,加上一个float类型等等,像这种场景呢,我们就用double to,说白了就是两个slot,主要就是它。OK,这呢主要是复制啊,复制完以后呢,你直接就放到这个站顶就可以了,对吧,那下边这个带这个杠X的这个除了复制之外呢,还涉及到叫插入的一个操作。那所以这块呢,就稍微的麻烦一些,那一会儿呢,咱们也有一个例子带着大家呢,熟悉一下啊。那我们首先来看一下这个dump,这个X1,那首先说这个dump跟这个MP to dump to,那就涉及到了我们还是复制一个slot,还是复制两个slot的问题,对吧?这个咱们在上面已经说过了,那这个插入的话呢,到底往哪插呢?这里边有个小的技巧,就是将我们这个damp和这个X的这个系数啊相加,相加的结果呢,就是我们要插入的一个位置。
03:19
就是插入这个位置,那这时候呢,相加这个数呢,咱们理解成是几个slot的意思,几个slot的意思,那比如说这我们就先举个这样的例子,我现在呢,这里边有一个元素,这呢是一个slot,注意一个slot我这写一啊,我们再整点吧。这儿也是一个slot,这呢也是一个这个slot行没问题,那针对于你占领的元素呢,我们现在有个damp x1对吧。那这个呢大这是个一,然后这也有个一,一加一是二,那首先呢,表示就是我们把占顶那个元素,你这是一个slot,把它呢复制一份,比如我们这儿呢,我这就给个标识啊,这个标识一,这个标识二,这个是标识三行,然后呢,我们把这个最顶上的这个三相当于是复制一份,对吧?但是复制完以后的话呢,不能放在这儿了,我们要这个一加一是二,那就是两个这个slot的下边,那就一个。
04:12
两个是不是我们要放的话呢,就放到这个位置了。就是放到两个这个捞的这个下边。行,这是它,然后呢,如果是这个dump,这个叫X2呢,这一加二是三,那就放到这个三个这个slot的这个下边。能理解吧,就这个意思行,那如果呢叫do to x1,那这个时候呢,就是我们要复制俩了,当然一般情况下呢,我们此时呢,通常涉及到的都是这样这样的一个场景,就是咱们现在呢,要复制的这个呢,是两个slot。这是两个slot行,这是两个这个slo的话呢,我们把它呢复制一份,这个呢,因为你是两个slot,所以就得这样写了,对吧。加写,然后呢,这个二加一是三,那就是三个slo的下面这呢,注意这已经是占用两个了,这呢是一个的sloter,所以我们把它呢,是不是要放在这儿了,诶画过了是不是放这儿对吧?那这个这个是个二,这也是个二呢,那我们就是把它要放在它占两个三个四个是不是就往这放就行了。
05:12
OK吧,嗯,行,那有没有同学问说,哎,怎么不把这个放到这块下边呢?怎么放这儿呢?啊,这是不是就没意思了,因为你这两个呢是一样的,是复制品嘛,对吧,那你往这放那跟不放是不是没有区别啊,所以要放的话呢,也得最起码得过了它之后再往下放才有意义。对吧,就像刚才我们说这个一样,你这块呢,咱们刚才这是一个,这是一个,这是一个,这是标是一,这标识二,这是标识三都各自是一个lo,你把这个三呢复制了一份,你说我放在这个三下边没有意义啊,它俩一样是吧,那最起码放是不是也得往这放啊,就是我们这个一加一等于二你得往这放OK吧。行这呢,就我们说的这个叫复制加上一个插入的一个操作。完事了,然后在下边的话呢,就提到这个叫swap swap呢是交换两个slot,注意这个呢是交换两个最顶端的这个slot。
06:03
一个两个,这呢是一个slot,就是四个字节,四个字节把它两个交换一下,就这个意思,注意呢,我们这去你没有提换提供那个交换两个64位的一个结构的这个场景啊,只有一个swap,没有swap to啊这个大家注意,然后另外一个呢叫OPP,它呢是一个特殊的指令,那磁解码呢,你看都很特殊,咱们说前面这些每一个指令呢,都对应着有一个。是不是一个指令啊,你随便你比如说点了个new new这个指令,你看对应我们这呢,就是一个BD,那每一个这个自节码指令都会对应着一个二进制的一个数值,但是这块呢,有个比较特别的呢,叫OPP,你看它是个零零啊,就是相当于翻译过来它就是个零,那对于这种呢,咱们通常都像这个基本数据类型定义默认值一样,对吧,像这种都没有特殊含义了,所以呢,我们这个指令呢,一般是用于调试或者占位去使用的,这个大家了解一下就行。整个的咱们讲的这些指令呢,都属于这个叫通用类型,对站的这个压入还是弹出,无需指明具体的数据类型,咱不是说呢,也确实有这样的一类嘛,像咱们这个一开始提到这个最起码指定的时候,这个goto它不是也属于这个无需指定具体类型的这种场景,对吧?好,那这块呢,咱们把这几个说完之后呢,就看一下这个具体的例子了,几个例子呢,就大家看这个就行。
07:15
首先的话呢,我们来看这个第一个我们用了一个对象,然后调这个对象的一个to string的方法来这块我们把它呢做一个re compile。这块呢,我们来一个view。先来看一下,这个叫print对吧。来分析一下,那这块的话呢,我们涉及到这个复制的一个操作了,嗯,你看一下这个什么意思啊,这块咱们就直接来这画了啊。这呢是这个操作入站,这个呢是我们的局部变量表,那我们new一个object这块呢,涉及到一个new的操作,New的操作,New完以后呢,我们这块呢,就是在你这空间开辟一个内存空间,找个对象,把地址呢附到我们这个位置上,这个叫0X啊要要要要行,这块我们已经放好了,接下来的话呢,有一个大MP的操作。
08:00
就是将我们生成这个引用呢,再复制一份0X要要要要行,这个呢就叫个damp,那我们知道这个用类型呢,就占一个草位,所以这块呢就是dump,没有必要damp to了,它是一个槽位嘛,行,再接下来呢,去调用咱们这个叫类实力构造器方法。那就是in,相当于我们要把这个构造器中有可能会给我们当前这个创建的对象的属性呢,进行的这个字段是吧,进行一个初始化啊这里边呢,实际上这个构造器是没有任何参数的,那这个时候呢,调special的时候呢,需要消耗一个。这个。引用对吧,哎,所以这时候我们复制的这个结构呢,就干掉了,他呢就出战了。然后的话呢,把我们留的这个0X1111作为一个数据存储在我们这个局部变量表这个所以为一的这个位置,所以0X要要要要就放到这了,然后它呢就也出站了,在接下来的话呢,叫alo的下划线一,然后把我们这个0X11呢再整过来。
09:00
行,这就过来了,到这儿了,然后再接下来呢,我们去调了一个叫toth润的方法啊,那这时候呢,就是调它的twoth润方法,它也出去了,调用完成对吧?调完成以后呢,这个大家会看到这个有一个A到二,因为你调用这个方法的话呢,相当于要开启一个新的战争嘛,然后新的战争这个调用完以后呢,这个to string方法咱都知道返回值是不是string,所以呢,这个战针它最后的返回值那块对应的指令。大家知道怎么写吗?引用类型是不是就是A开头的对吧?然后a return啊,咱们上面刚讲的对吧?行,那这个a return呢,就相当于把你这个方法调用完以后呢,那个结果又要返回到咱们当前的,呃,这个叫print这个方法的操作式站当中,那这块就回来了,那实际返回的就是咱们当前你造的这个对象,呃,就是那个字符串的一个信息对吧,那就放到这儿,比如说object Java点浪包下的object是吧,这样的一个字符串信息,然后这个字符串信息呢,放在我们这个操作站当中,接着呢,把它保存在死轮类型嘛,所以就是A开头的这个缩引为二的这个位置,这呢就写一个叫。
10:04
OK。就是我们刚才说的这个信息就保存在这儿,然后他呢就相应的也出站了,然后这个方法呢,是一个word的这个就一个return。对吧,这就是整个我们这个一个结束。能行吧,这里边我们就见到这个叫dump,就是复制一下我们这个站顶的这个创建的对象的引用,那你要不复制的话呢,因为下边我们要用两次嘛,就不够用了,所以呢,就咱们这要复制一份,OK,就是这个意思,那现在呢,大家注意我把这个呢给注释调,注释调的话呢,我直接呢就来一个obj调一个这个出润。直接这样子对吧,那大家看一下这个场景又是什么样的呢。咱们再做一个编译。好过过来这呢,注意是咱们这个旧的,我把它呢作为一个。盯一下放在这儿,现在你看别眨眼,我要刷新了啊。诶好像这块呢,你看一对比,是不是主要就这块儿有个变化呀。那这个是什么意思啊。来分析一下,咱们刚才这块呢,整个这个过程咱们就快速的过一下,首先呢,这个叫0X1111,复制这一份0X1111,然后这块呢,去调这个类实力构造器方法,然后它就干掉了,然后在这块呢,把保存到我们这个索引为一的位置,1111啊这个的就没有了,接着呢,把它再加载过来,0X1111对吧?下边呢,去调一下我们这个to方法,调这个方法呢,它就出去了,调va以后这个数据就回来了,就是我们刚才说的Java,呃,这个斜线浪下的Java,点浪下的那个object对吧?这个字串就过来了,过来之后的话呢,我们后边要return。
11:35
你像咱们刚才这块呢,你把这个数据存储在我们这个局变量表这个位置的,所以我们就要出站了,现在呢,你这个也不用是吧,后边呢就直接return了,所以我们操作出站中的这个数据啊,就没有用,所以呢,咱们这有个叫pop,就直接呢把它就诶驱逐站了,又因为呢,你这个是赢类型,就只有一个slo槽位,所以呢就是pop,你要是一个浪类型的,那就是pop two了。能理解是吧,好,这就我们说的它啊,然后呢,我们再往下看,在我们的这个fo里边呢,调这个BA2,调这个BA2,那就是咱们下边这个事儿,把这个呢一打开,实际上咱们刚才呢,也提到这个场景了,我这个fo里边调另外一个方法,调这个方法呢,这个结果,它这个结果呢,是不是要返回咱们这个foo。
12:21
啊,你这个战争是吧,结果我们要获取的这个结果呢,是个零,但是你这个零呢,注意是一个浪类型的,所以呢,它要占两个slot。那这个结果的话呢,咱们这也没有把它死到到一个,比如局部变量表里边,那相应的我们这个fo呢,下边要结束的话,这个操作入站中,就是你自己的这个fo,这个方法的操作入站中是不是这个。BAR2给你返回的这个零数据就没有用,对吧,所以我们这有一个popb,当然呢,由于你是两个slot,所以它就是二。很清楚对吧,行,这就结束了,然后咱们来看一个稍微有难度的。下边这个操作,因为这里边儿呢,涉及到咱们这个插入的一个行为好。
13:01
来咱们看这个。这块呢,咱们做个分析,那这个分析的话呢,咱们这样啊,我把这个CTRLC一下,咱们在咱这块呢来写。点这个对吧。看着这个代码量呢,其实不大,但是这里边儿这个细节啊,咱们需要给他做一个说明。好,这个咱们就收起来啊,整个这个操作呢,咱们给他听一下。行来咱们下边分析,那这个操作的话呢,首先叫LOAD0,这个LO0呢,呃,当我们调用这个方法的时候呢,是一个非静态的,咱们这个索引这个位置实际上呢,存在就是咱们那个Z对应的那个地址值对吧?举个例子,咱们当前那个对象呢,假设呢,是这个1212。这就是咱们当前调用这个next这个方法的那个所在类的对象啊,那首先呢,把LO0就是你这个角标零的这个呢数据拿过来,那这呢就是0X这个1212对吧。
14:06
行,这就过来了,然后过来之后呢,把它呢,做一个dump,做一个复制,那就是哎,复制一份你放这儿呗。没问题对吧,在下面的话呢,我们就要get field,那我们要获取一个它的属性,那我们要消耗一个当前这个实力,它就出去了,出去之后呢,把你当前这个对象所对应的那个属性叫index呢给拿过来,那这呢其实就过来一个index,当然真正放的其实是它的这个值,对吧?那这个对象呢,因为已经创建好了,你这个当前对象如果没有再进行过修改值的话呢,这个值呢,咱们现在是零。啊,OK,是零,比如说你下边没有那个代码块啊啥的,对它进行一个修改,那这块就是显示负的,这个值是零没问题,行,那现在的话呢,就是get field放这儿了,是入操作处站。然后再接下来,你看这个就有区别了,这个叫dump to,诶这块大家还有一个小细节要小心一点,咱们这个index啊,你看我这是不是long类型的呀。
15:05
蜡类型就意味着它实际上是不是要占用这两个空间啊,我稍微的把这个颜色变一下,它要占据这两个空间啊,所以呢,这块你看Du to就是我们要复制的话呢,是不是就复制这两个槽位的呀。嗯,这要小心一点,行,那复制一份,那我们按说的话呢,直接复制一份,那我就整这是不是就行了,但是你注意他这呢,有个叫X1,意味着咱们要做一个插入操作,插到哪呢?二加一是不是三呀,相当于把你复制的这个结构呢,要往下数三个槽位。一个槽位两个槽位,这个呢已经没有了。那就是这个放到它的下边。能理解是吧,那放到它的下边,那相当于咱们这个结构呢,就有变化了,那我这么着一下。嗯,操作数占。这个CTRLC一下,这个我往这儿放一下吧。
16:02
嗯,这个呢,咱就别别往这放了,它显然不应该是这样子的,对吧,只有把它CTRLCL一下。这样。保存啊,咱们现在要复制的话呢,就变成这样了,嗯,它这个结构就是这个这个已经没有了。这样吧,我把它CTRLC它在这。然后这个。嗯,这两个其实留留留,这就留一个就完了呗。有点复杂。讲完了。这个我们用一个框是吧。行,我这样框一下。这个粗细好像稍微有点不一样啊,这个大家理解这个意思就行,你看我们现在呢,这个复制的这一份儿,这呢是本身人家这个,然后我们复制的这一份呢,需要插入到一个两个三个槽位的下面,那这块呢,不就呈现出是这样的一个场景了,OK,这个呢大家要清楚。
17:05
这个指针指一下行就变成这个场景了,然后的话呢,我们接下来就l cost1,那我们这呢,相当于又压入一个操作站中的数据,这个呢是一个一,注意是一个浪类型的,对吧?浪类型的,所以这块呢又得占用,现在这是两个槽位,咱们再换一个颜色,比如这个颜色,我我就把这个数据呢就写这了啊这是一个一。行,这个过来了,然后呢叫IL,那就把这个数据跟这个数据呢,它俩是不是做了一个这个添加的一个操作,对吧,那它俩加完以后这块我们就把这个就变成灰色了啊,我就不再去新化了,他俩呢,添加完以后的话呢,这个结果零加一是不是就还是一样,那这个结果呢,就在这儿,但是这个结果你注意它还是两个槽位。嗯,换一个这个色吧,还有两个槽位行,这就我们这个数据,然后再接下来呢,这个叫put field put费呢,就是我们这个要出去了,出去的话呢,这时候要把我们当前你这个对象的这个index呢,是不是要做一个输出,对吧,要出站出我们这个index。
18:10
嗯,这个是咱们当前这个对象的引用是吧,就是我现在要调用当前这个对象,我们就是当前这个对象它的一个属性,这个值是几呢?是指是一来做一个put特操作,这不就出去了对吧?那出去呢,这块就没有了。灰色的这块呢,就也没有了。OK,然后最后呢叫l return,那返回返回什么呢?返回这个零,你看我们这个呢,返回最终这个结果呢是个零,那从咱们Java代码的层面来看的话呢,咱们这个方法调用完以后,引带子值呢,确实变成一了,但是咱们本身这个返回值呢,实际上还是零。能理解是吧,所以你看这个时候呢,就是我们把这个理论给他返回了。那这样就结束了,行,那通过刚才咱们这个过程的介绍呢,大家需要去熟悉的,或者需要去理解的,就是这块稍微有一点难度的,就是关于这个插入的这个事儿。
19:01
啊,就这里边的带X的这个问题OK就行了,那关于我们说这个操作站本身的管理呢,大家见的比较多的呢,主要就是我们这个关于dump,还有这个pump。啊碰碰啊,这个见的稍微多一些行,那这呢,咱们就把这个操作站管理指令呢,就说到这儿。
我来说两句