00:00
那接着呀,咱们来看这个第二类叫做常量入站指令。常量入站指令,这个站呢,仍然指的是操作数站,常量呢就是我们在常量池当中这个定义好的一些常量数据。那常量入站指令的功能呢,就是将常量呢压入操作数站,根据数据类型和入站内容的不同,咱们呢又可以分成叫cost系列,Push系列和LDC系列。那这三个系列呢,当我们讲完之后呢,大家也会发现,它其实对应的范围呢,就依次变大。对应的范围依次变大,什么范围呢?就是我们这个常量的一个表示的数值的一个范围,好首先呢,我们来看一下,这个叫cos系列。对于这个用于对特定的常量入站。这个入站的常量呢,隐藏在指令本身里边,常量的这个一方面是数据,另外一方面呢,就是这个类型也指明了,对吧?首先我们看到这里边主体的有IFDA,这呢也是咱们说到的这个几类比较典型的这个类型了,对吧?I呢,自然而然就是in的类型,好呃,In类型,当然这个咱们还不能解释太多啊,关于这个bit short怎么办呢?这个咱们一会说主要呢,以I为代表的,其实就是我们说的这个整形里边的四个字节来表示的啊。
01:19
那么此时这个I的话呢,它已经把这个数据隐含在这里边了,注意这个I呢,它表示的是负一到五,它不像咱们刚才讲到的局部变量压占指令,这里边儿这个N它表示的是索引。对吧,咱们刚才这里边儿提到的这个I呢,指的是索引I,咱们这里边儿呢,不是索引了。下边这个这个呢,就是表示的有一个数据,比如说icon的这个,我们说叫一,这个值假设是一的话呢,它其实就是我们定义了一个I,这个I呢就是一,数值是一是数据值,不是索引值啊,然后这个L的话呢,这个就是long类型的,然后这个L呢,它只能取值零或一,注意只有两。
02:02
这个float这块呢,是012都可以。然后这个D的话呢,我们说就是double的,它这个D的话呢,也可以是零或者是一,注意这里边儿呢,没有特定的规律了,它是负一到五,这是这个,这是这个,这个只能是单独的去记忆,没有为什么,那在后边这个呢,叫a cost,这个A呢,我们知道就是引用数据类型,那对于我们说所有的引用数据类型,他们都有一个共同的默认值,那就是nu值,所以这块呢,我们要定义也只能是定一个含有nu的这样的一个默认情况。那你要不是闹的话呢,那就是各个类型他们自己去扭对象去赋值,各个情况都不一样了,我们就没有必要再去提供一个这个特定的一个,呃,操作码了,对吧。好,那下边呢,有一些具体的例子,这个例子里边呢,我们看到这个,嗯,关于I cost是负一的话呢,这写的不是负一,是M1表示的是负一的这个情况。啊,负一的情况,然后后边这块呢,这都是咱们刚才提到的这样几个例子啊,这就过了,那么如果说举个例子啊,刚才咱们提到了我这块int一个I,它的值呢,就是一个三。
03:07
那此时的话呢,我们底层呢,就叫icon_三。就是这个意思,那现在问一个问题,那如果我in一个阶,这个值是五的话呢,也没问题,这还是五对吧?那如果我们这个值是六呢。那有同学会想,那是不是就变成这个样子了呢?Constant下线六肯定没有了,对吧,是不是这样写呢?注意这个时候呢,就不是这样写了。也就是说呢,当我们这个嗯,I不在负一到五之间的时候呢,这个时候我们就要引入下边这个叫push系列。不是这样写了,那应该是怎么写呢?这个写法呢叫BI push,然后呢是一个六。是这样写的。这样写的啊,比如说是他呀,还是他呀。我把这个给你留着。这个六是吧,那其实没有这个东西啊,这个注意这个是错的,那我们看一下这个push系列,主要呢,Push系列就只有两种,一个呢叫BI push,一个叫SI push,他们的区别呢在于接收数据类型的不同,BI push呢就是八位,然后SI push就16位,说白了就是BI push就是256种情况,然后呢,这个SI的话呢,就是跟shortt类型一样,两个字节嘛,对吧?行,那对应的这个范围能接收的,那对于BAT来讲,它有正有负嘛,所以跟原来我们说BAT的存储范围是一样的,负128到正极二七,那这个上的类型呢,就负的32768到正的32767。
04:33
就这个范围OK,然后呢,再往后考虑,如果说我们现在定一个注意看啊,我int一个K是327。六七后边是32768,当我定一个K是32768的时候,此时呢,我们用SI就不行了,对吧,那我们这时候呢,就要用到这个LDC系列。得用LDC系列了,那LDC系列呢,就下面下面写的说,如果以上指令呢都不能满足需求,那么则可以考虑万能的LDC指令,它接收一个八位的参数,该参数呢指向常量池中是int float或string类型的索引,那个索引对应的就是一个具体的数值呗。
05:15
比如说呢,我们是32768这个数值,你看那个在常量池的一个索引是多少,那LDC后边呢,就配那个索引。就可以了,然后把这个对应的数据呢,找到以后压到我们这个操作站当中啊是这样,那类似呢,说L还有这个LDC-W这个呢,主要涉及到它可以接收两个参两两个八位的这个参数。两个八倍的参数就相当于两个字节呗,对吧,就是支持的这个索引范围比较大。啊,如果说你这个常量池里边这个,呃,用到的这个LDC对应那个索引比较大了,这时候我们就自动的切换成LDC-W啊是这个情况行,再往下的话呢,说如果咱们压入的这个元素是long的,或者是W类型的,这个时候呢,会l DC two。啊,这个to你可以理解成就是我们说两个槽位嘛,这个咱们前面也都提到过这个事儿,对吧?啊这就可以了,然后下边呢有个表格,表格呢,咱们暂时呢可以先不看,然后大家呢,回过来咱们看一下这里边儿我给大家呢,提前写好的这样两个这个方法啊,咱们看一下里边这个情况。
06:15
这个呢也是精心设计的啊,这个用的都是一些临界的这些值,哎,大家一看呢就能明白,首先呢,把我们当前这个代码呢,咱们做个编译。哎,接下来的话呢,我们做一个show看一下刷新一下,针对于我们这个push cost l DC,它然后看下这个code行这块我们就来分析,首先我这个值呢,写的是一个五。对吧,写的是个五,或者我们这块再补一个一个abcd,这我们写一个I吧,给我写一个负一。咱们刚才不是说了有个负一对吧,我重新的再去编译一下。刷新一下,好,这是大家看这个负一呢,咱们刚才说它比较特别,叫icon的下划线M1啊,它指的呢,就是我们说这个负一行,然后对于这个icons系列呢,我们说最大的那个杠呢,是不是就涉及到杠五啊。
07:09
所以这里边儿你看这个A是五的时候呢,就用的是它。这个我们这样这样一下吧。就它对吧,行,然后再往下,当我们这个新的一个变量值是六的时候,六呢,已经超出了我们负一到五这个范围,这个时候呢,不是用的icon的空格,六用的是BI push。对应的就是它。这有一个对应关系。没问题对吧,中间呢,我们这里边I store这个呢,是咱们下一个要讲的,把这个数据呢,存储在局部变量表中的这个意思,咱们一会儿再说,先主要说我们这个push系列,这个系列啊LDC这块,然后再往下的话呢,这个BI push,我们说最大接触的是正的二七,所以呢,正二七这块呢,用的还是BI push,但当我们是128的时候呢,这时候就开始替换成叫SI push。诶,注意这时候叫SI,明白对吧,然后SI它能够接收的最大的一个数值,咱们提到的是负的32768到正的32767,所以呢,是32767的时候还是SI,当我们变成了32768的时候,这时候呢,SI已经搞不定了,更大范围的数据,我们使用的是LDCLDC的话呢,后边跟的不是一个常量值,而是一个。
08:27
这个这个常量池当中的一个索引,对吧,这个索引是七,这个七呢,你上面去找一下,就它这个呢,值是32768。37吧。OK,这呢就是我们说的这样一个情况,那通过这个呢,大家整个呢,从上往下去捋顺一下,我们针对的都是int类型,但是呢,我们这里边看到了。把它收起来。咱们看到了它用的这个指令呢,可都不是都是I开头的啊,有B开头的,S开头的LLDC对吧,那你知道呢,这个原因是什么,因为这个范围。
09:04
这个数据的这个范围越来越大,所以有这样的一个场景,那回过来大家来看一下我们这里边儿这个表格,就是说当我们定义的这个整形是负一到五范围内的,就是它这个范围不在这个上面这个范围之外的啊,但是又在这个范围内呢,就用它。然后不在这个范围,但是又在这个范围内呢,就开始用它,那这个这个范围不在的,那我们就LDC了。能理解吧,就是这个意思,那这个如果大家清楚以后,那下边我们说一下这个像long float double,其实大家呢,就也都能搞定,什么意思啊,这个浪呢,它只能。这个定义的这个值呢是零或者一,只要呢,你这个常量值不是零或一,那就用LDC了,Float呢是012,大部分呢是零一,只要不是这几个数值都用LDC。啊,那下边咱们这块是不是有。其他的这个例子了,对吧。大家看这时候呢,Constant l DC,咱们这时候看一下这个呗。
10:01
打开它分析。换成一个红色的。红色的。行红笔,那现在的话呢,你看我定一个long型的叫A1,这个值呢是一,那因为呢,我们说long刚才看到了COST0或一,它能搞定对吧,所以这时候呢,它用的是l cost小选一,然后当我们这个值变成二的时候呢,它就搞不定了。他搞不定了,这时候呢,它叫LDC系列的LDC,因为我们这时候是个long类型,Long类型咱们在这儿。看这诶。看这咱们提到这个long类型的和double类型的是用的是l DC two对吧,所以这里这时候呢。咱们这在这看到就是l DC twow。这儿呢,后边跟的LDC系列,后边跟的都是常量池的那个索引,所以那个索引对应的那个常量值,这个我就不去看了,这个值就是二。好,下边这个float float呢,它支持的012,所以这里边当我们这个支持二的时候呢,能搞定。
11:06
FLOAT012对吧,哎,它可以搞定,当你要超过这个二的时候呢,变成三了,那自然而然的又是LDC系列的。不用多解释,那LDC这个杠W这个呢,是因为你那个索引,如果索引值太大了,这个时候换成杠W,咱们现在呢这个。十嘛,这个范围不会太大,一个字节就能搞定,所以这块呢,我们就ldc OK这个如果说我们常量池里边这个常量特别多的时候,我们引入的那个常量一个字节搞不定了,就用两个字节表示那个索引,这时候它会自动的替换成杠W,这个就咱们现在没法演示了,那你这里边常量得特别多才行,对吧。再往下的话呢,这是double的double情况,这个它也能够支持零或一,当你要超了变成二的时候,这个时候呢,是不是就用l DC to-W了,跟我们刚才说这个long其实类似,对吧?不用多解释,那你会发现呢,我们这时候float这三,这个double是二的时候呢,你看自动这个值呢,它就自动的就变成个负电型了,点零就给我们补上了。
12:08
再往后的话呢,这里边儿我们定义了一个引用数据类型,这个赋值是个nor,哎,这呢就是a cost_no这样的一个情况。因为这时候我们这个值确实是个no对吧,OK行,那这样的话呢,咱们就把这几个指令呢,应该是就说清楚了,大家呢,稍微的捋顺一下。体会一下,我们说cost push l DC,实际上呢,他们表述的范围是依次越来越大的。啊,这样一个情况,这呢就是叫常量入站指令,我们在这个实际开发当中,只要你定义一个变量赋值了,都会涉及到这样的一些指令的使用,到时候呢,大家得稍微的得能看得懂,这个呢也是入站的操作,刚才我们刚这样去对应了,啊这个实际上呢,就是我们定一个A是一的时候呢,咱们这呢是一个。好的时候站这些时候呢,就会把你这个一的这个值呢,就放到我们这个站里边。但是这个一呢,你注意我们这是不是个浪类型啊,浪类型是不是就得占两个这个四个字节的,对吧,所以你在放这二的时候呢,是不是就得再往上放了。
13:09
能理解吧,你看这里边是不是还蕴蕴含了一个知识点,Long类型,你看我这儿呢,保存的时候呢,是L到一,这个一呢又是索引的意思。当然这时候这个一呢,是我们放在这个局部变量表,就是咱们下边要讲的这个操作的时候,这个一呢是索引一的位置,那第二个我们在放的时候呢,我这就放到索引三的位置了。因为一跟二呢,是不是都被这个浪占用了,所以它只能是三,那这个float呢,它是不是又占一个槽位啊。他占一个槽位,那三次占了,那下一个槽位呢,是不是该五了六个float float就占一个,然后他这就接着600。然后double double的话呢,从七这块开始,然后呢,你占两个槽位,那下一个double的话呢,不就该九了嘛,对吧?哎这呢,我们就知道呢,什么原因造成的,那关于这个store指令呢,这是咱们下边呢要讲的这个,哎,出站装入局部变量表的这个指令。
14:07
行,那关于这个常量入站指令,我们就说到这儿。
我来说两句