00:00
那最后呢,咱们来看一下这个控制转移指令的第四个叫做无条件跳转,无条件跳转就是我们肯定要跳转的,这个呢,主要指的叫got To Got to呢,它主要接收两个字节的一个操作数啊,注意后边跟两个字节的操作数就表明呢,你要跳转到哪一个偏移量的那个位置啊,共同组成一个带符号的一个整数啊,用于指令这个指令它的偏移量,那指令这个执行的目的呢,就是跳转到你偏移量给定的那个未知数,其实咱们在前面这块是不是都已经大量的出现的关于这个goto的这个场景,对吧,前面我们这块是不是都有,那goto后边跟一个这叫两个字节的一个偏移量,那这两个字节呢,表示的这个数量要46,那你直接跳移到偏移量为46的这个位置,那就可以了。啊,就是这个场景。好,那么下边说,如果你你这个指令的偏移量太大了,那我们也可以,呃,超过了这个双字节的,就是咱们用两个字节来表示嘛,超过了的话呢,我们还可以用叫goto_W。它的作用呢,跟构图一样,只不过呢,这时候接收呢,叫四个字节的操作数,那表示的这个地址范围就更大了,也就是说呢,当我们一个方法的方法起你写的特别长的时候呢,那咱们要跳转你下边这个指令,那肯定就特别多,有可能这个goto。
01:13
这个位置这个偏移量啊,就是特别大了,超两个字节都搞不定了,就相当于咱们这个short的这个范围,当然short范围还不准确,因为short我们说有正有负,咱们这里边两个字节呢,是无符号的,那其实叫655。65356535了是吧,就相当于有这么大一个范围,这个范围呢,你都搞不定的话呢,我们再就是用那个goto-W,那你就相当于是四个字节啊,那那那个就大多了,肯定是能四个字节是够的,咱们这个代码量应该不至于那么大。啊,不至于那么大。行,那这个呢,我们再回过来这呢,就提到了一个got图下划线W的问题,说另外还有一个涉及到指定角GS2GS2_W啊,这个道理跟这个道理是一样子的,还有呢,Ret啊这个这几个指令呢,也是无条件跳转,但是主要呢是用在这个try finally当中,但是呢,到目前为止呢,咱们try finally这块其实也主要主要用这个异常表来表示了,所以呢,我们这三个指令呢,已经逐渐被这个depre了,所以这呢,咱们就不做过多的讲解,大家呢,也没有必要呢再去研究它了。
02:14
主要呢,其实我们正常用的比较多的就是goto这个杠W,其实基本上都很少见。都很少见,从使用概率上来讲很少见,因为咱们这个方法体呢,通常不会写的那么多,对吧,你说一个两个字节都搞不定,你这个要跳转的那个偏移量,那你这个代码量它得多大呀。对吧,是这意思行,那接下来的话呢,我们就来看一下这个got to的这个操作,Got to这个操作呢,我其实咱们上面已经见到过了,这块呢,我就举了几个以这个循环结构来表示的这样的一个结构,那些同学可能会想,这个咱们前面咱们讲的好像都是条件判断,对吧,咱们这个循环结构也没有特意的讲啊,实际上这个循环结构的话呢,在我们最金码指令这块,它其实里边也涉及到了这个循环条件,那循环条件呢,就是咱们上面提到的那种条件判断嘛。
03:00
对吧,就是条件判断,然后循环呢,无外乎就是多次执行你这个条件判断,那我们就可以搭配上这个goto呢,来实现这样的效果,那这里边儿咱们做一个re compile。那回过来咱们来看一下这个。这个while,它的这个code。是吧,哎,就这个结构好,那具体的咱们这个从语法层面来去解释这个while这个循环大家应该不陌生,应该都能搞得定,我定了个ii,如果要小于100,我这就输出了一个I的硅谷点,Comi,加加之后呢,又小于100,再接着输出,再输出,直到呢,我们这I恰好呢,加加完以后是100了,不满足,那我们就跳出当前循环结构。很清晰对吧,那我们来看一下这个代码资金码这个层面它是怎么做的。首先的话呢,我们从那个操作站里边呢,咱们入一个零。然后把它保存在这个索引为这个一的这个位置,那这呢就是个零,那索引为一的位置其实就是我们这个I呗,那零就过来了,那这个呢就没有了,接下来呢,把我们这个索引为一的这个I的值零拿过来。
04:03
拿回来之后呢,B是一个100放这儿。再接下来呢,叫if,这不是咱们前面已经角了,叫这个关于我们这个int类型这块的一个比较,那我们判断一下,这叫greater than or equals,就是相于零是不是greater z大于等于100吧。零大于等于100吗?不满足不满足我们就直接呢往下走不跳转往下走叫LDC啊,这两个就出去了,对吧,这个LDC呢,就是把我们这个艾特硅谷就进来了,进来之后,然后STORY2那这块呢,就存储在这个艾特硅谷就放这了,这其实我们变量名就是S呗。嗯,这不就到这儿了,这其实就是相当于我们执行了一下这个方法体的这个操作。这个循环体的操作,然后再接下来呢,叫I increase,这个一就是我们对应的这个角标为一的这个位置呢,呃,让它加个一,那就相当于它就变成了一了。它就变成一了,对吧,没问题,然后呢,再goto一下二,Goto一下二,注意这块呢,咱们这个刚才这个爱的硅谷呢,刚才放到这它不就也没有了吗?然后这个加完以后呢,再勾出一下二,二呢就是又回到了这个,你看还有个减号呢啊就回来了。
05:10
回到这儿了,回到这儿的话呢,叫I漏的一,相当于又把这个I的这个值呢,这不又加载过来,它这时候不是已经是一了吗?来一进来一进来以后呢,再push一下这个100。然后再进行一个比较,说一呢大于等于100吗?显然也不满足,那就接着再往下走,再压入一个艾特硅谷,然后艾特硅谷呢,再把它干掉,然后保存在我们这个位置啊,又相当于覆盖了一份爱的硅谷。没问题是吧,那这个呢就没有了,再接下来呢,再让我们这个索引为一的这个位置呢,再加个一,那这块它就变成二了,然后再执行这个循环,所以从代码层面来看,咱们像while,包括像for结构呢,它其实都没有对应的这个词解码指令,就是我们通过这个你往下做一个比较,这呢就是咱们前面讲的比较了,然后无条件跳转这块呢,就通过构图,我呢除了往下构图,还可以往上构图,这不就实现了中间的这样的一段代码呢,反复的执行吗?
06:04
就类似于咱们说的循环的循环体,哎,就是这样的效果。所以这样呢,大家你看了资金码之后,我觉得啊,我觉得对于呢,开发的人员来讲,看了资金码这些结构之后呢,你的功力应该有一个大的提升。就是如果说大家练的具体的一些招数,那些呢,都是一些形而上的东西的话呢,那你学习这个四千八指令,那有点呢,就像这个武当里边那个就是张无忌学的那个九阴真经一样,它呢是更底层的东西,这个呢啊,其实呢是呃,随着我们张大云的不断迭代更新,它的变化其实不大的,包括呢,我们这个翻来覆去也提到了,有很多咱们在代码层面你看不到的东西,通过字节码指令呢,是都可以看到这些细节的,它是怎么设计的,怎么保证这个效率的,那也是都可以说清楚。啊,像我最开始学这个Java的时候呢,有的时候想解释一个结构这个东西到底怎么去理解啊,然后不清楚,那怎么办呢?这个我们就得去查百度对吧,百度呢,基于的前提是别人这个发货相关的一些答案,然后你才能够搜到,那再后来的话呢,还有像看这个国外的像stack overflow这样的平台,包括呢,有的时候做一些项目呢,就是想get upb,但是呢,呃,毕竟这些东西都是别人嚼过的东西,那然后呢,你恰好你搜到了,而且呢是比较幸运的找到这个正确答案了,那你才能更清晰是吧?那以后的话呢,大家很多这个代码层面的东西呢,你就可以深入这个资金码指令去解释了。
07:31
你说呢,哎,我看了看最起码指令说呢,怎么怎么着,这个以前的时候呢,别人要这样一说,总感觉好像很高大上,那其实现在呢,大家是不是也正在做这个事儿。啊,你看这个while循环资金码指令里边,你根本就不会看到while的这个结构,只不过呢,就是一个循环条件,就是咱们上面说的这个相关的这个条件判断的这个指令跟我们这个勾图的一个搭配,仅此而已,完事是吧。好,那再往下这块呢,实际上只是换成了一个double类型的结构而已,Double类型的结构而已,那其实这个难度呢,这个具体的这个效果啊,这个判别的这个步骤啊,跟刚才是一样的啊,再来墨迹一下。
08:10
这呢是这个操作数站,首先呢,这个压入一个零,那注意是占两个槽位,这个就不用多说了,然后在这个索引为一的这个位置上把它保存一下这个零,就准确的说呢,在这保存就是0.0了,对吧,在这块保存这是一个就咱们这个变量名不是也叫D嘛,嗯,放在这儿,然后它呢出去了就干掉,接着把这个零呢再加载进来。然后下边呢,就是引入一个叫100.1。嗯,这个就放在这儿,然后呢,接着去做这个double类型的叫CMPG,这就是咱们说的比较指令对吧,那判断一下我们这个零这个它发现呢,是不是小于100.1啊,那这时候我们把它俩除去之后呢,是不是压入一个负一进来对吧?然后这个负一的话呢,判断它是不是叫g or equals,那叫是否大于等于这个,呃。零呗,是不是大于等于零这个事儿不满足,不满足就接着往下走,往下走的话呢,我们就这个就干掉了,呃,压入一个叫爱的硅谷啊,压入I的硅谷,把它保证在索引为三的位置,因为它占两个槽位嘛。
09:09
然后这是缩,因为三的位置艾特硅谷就进来了,那它就干掉了,然后接下来我们再去把这个零呢压进来,下边就下边就该开始这个,嗯,再把啊,这是因为咱们后边还有这个操作呢,是吧。这个我到哪儿了?嗯,这是如果,呃,这这压入了一个它,然后保存在这儿啊到这儿了是吧,到这之后呢,下边呢,就是D漏的一个一,再把我们缩以为一上的这个零呢,给它拿过来,拿过来放到这儿是吧,然后再压入一个一,然后压入个一。这一进来,然后这个叫Di的是把这俩除去之后,然后呢,相当于是零跟一做了一个和,是不是变成一了。也变成一了,然后把这一呢,再保存在我们这个下划线这个一的这个位置,相当于把这个呢再写到这儿,把它呢换成是个一,那大家你会发现跟咱们上边这块有点区别就是。我们关于这个int类型呢,咱们是不是就有一个呢,叫I increase是吧。
10:04
有这个指令说一百一啊索引一它的位置呢,哎,就是加了个一,那对于我们这个double类型呢,你看它处理呢,是把这个零呢加载过来,然后呢,再加载一个常量一,它俩做和之后把这个结果呢再写入到这儿。对吧,是这样一个场景,那所以说呢,咱们在使用当中,如果你要不是特别的非得用double的话呢,可以考虑用int类型来表示它呢,更简洁一些,对吧?行,那这块呢,我们又把它写入到这儿了,这变成个一了。保存在我们这个位置上了,这块也都没有了,然后下边这块呢,这不有个GOTO2嘛,嗯,凹GOTO2又跑到这儿来了。然后你这块呢,因为已经加了一个一了,然后跑到这来之后呢,把这个一呢再加载进来,加载进来之后呢,再把这个100点加载进来,然后再在下边比,这又是咱们说刚才一个重复的过程。行,这个就不用多说了,这个比较清楚,行这就过了啊,然后再往下这块呢,我写了一个for循环,那我们上边呢,是以while循环来举例子的,那我们下边来看这个for,那其实呢,从这个自检码这个角度呢,是一样的啊。
11:06
我这呢写的是一个少的类型,又换了一个场景,又换了一个具体的数据类型。好这块呢,先把这个零先整进来,然后四到道,所以为一这呢放个零,其实就是我们这个I。然后再这个就没有了,然后接着呢,I是一把这个零呢,再加载过来,然后BF这个100。然后判断一下,这个呢是我们判断零,嗯,这个叫什么呀?Greater or equals,那就是大于等于100的意思,对吧,这个呢,显然不满足,不满足就直接往下走,他俩就干掉了,往下走的话呢,这个艾特硅谷就进来了。然后把它呢,保存在这个索引为二的位置,叫I硅谷,这个对应我们这个变量叫S是吧。行,这个呢就干掉了,那保存到这儿了,然后接下来呢,再把我们这个I漏一下这个一把这个。一把它拿过来是吧,零放在这儿。嗯,然后呢,再加载一个一,然后I,然后它俩呢做一个和啊干掉,然后引入一个一,引入个一没问题对吧,引入完一之后呢,注意下边这个细节叫I to s,但这块呢是一个int类型,你现在是想把这个数据是保存在这个位置,但是这个位置I呢是个short类型,所以呢,我们得把这个数据类型给大家降一下。
12:16
降过来,你不能把in的类型复制给少的类型,对吧,降完之后呢,哎,把这个零呢就改成一了,哎排他俩就抹掉。嗯,那那这边是就S到到一这块了,就是先先改是吧,先改成少类型,然后呢,再转移过来啊store一下,再接着构图一下这个二啊又放到这儿,然后接着再去执行我们整体整个这个结构。行,这个过程呢,就是刚才我们描述的,那这里边你注意它也没有使用那个an increase110是吧,那因为呢,我们这是个少的类型,它还得是按照加载一个一,然后做一个和,然后呢,向下还得做一个窄化数据类型转化。啊,窄化的类型转换,然后呢,才能再把这个数据保存在我们少的类型里边。所以呢,在咱们实际开发当中啊,咱们是不是用in的类型确实要更多一些,对吧。
13:02
好,这就过了,再往下这块呢,实际上就是个小的思考,这个没啥,嗯,具体的这个新知识点了,实际上就说什么问题啊,大家你看一下,咱们在代码层面呢,我写了一个for,这个while循环,就是一,然后判断它是不是小等于100,然后呢,写了一个for循环,是这样写的,对吧。这两个的区别呢,咱们在讲这语法规则的时候啊,其实也强调过说基本上没什么区别,如果非要说有个区别的话呢,就仅仅是我们这个变量I的一个作用域不一样,对吧?除了这个Y循环,我们在这个位置还可以继续使用这个I。哎,可以继续这个,或者叫使用这个变量I,而我们在这个fo循环这块的话呢,是不是在此位置呢,是不是就不可以继续使用这个I了,对吧?区别呢,仅仅在这儿,那从具体这个执行这个细节来讲的话呢,其实它俩是一样子的,那我们从磁金码的这个角度呢,来看一下,你看咱们这个Y循环,我把它打开。
14:02
把这个呢,我稍微的这个盯一下。放在这儿,然后呢,你看我再打开这个for,大家呢,你主要看这块儿也行,你看它有没有变化。是不是完全一样啊,那就说明从词解码这个角度来讲呢,它俩呢是没有什么区别的啊,当然你涉及到这个作用问题,这是我们这个从语法上来讲它是不同的,但是具体一个执行细节,你定这个I,然后这个小点100再加加是吧,再回去判断跟这个流程它是一样的啊,那有点区别呢,是不是涉及到这个do well啊。Do呢,咱们提到过,它至少是不是会执行一次这个里边的这个爱加加这个操作是吧,那相当于就是这个结构,我们把它呢,先比如这样拿一下放到这儿,然后这块一打开,你看确实有些变化。就是有变化,咱们这里边儿呢,你看是不是得先判断满足了,就是你这个没有跳转的话呢,才实行一个这个一百一做一个加一,而这个呢,是不是保存完以后,上来就先一加一,然后后边这块呢,才才有一个这个判断。区别是在这儿对吧,所以说的话呢,就是这个结构啊,这个结构的话呢,它跟咱们这个结构的区别呢,就是它至少会执行一遍,那咱们把这个爱加加你也可以看成这个,呃,像这个叫这个循环体的这个结构了,是吧,它呢至少会执行一次,而这个呢,是那不一定会执行这个它的,因为你要满足这个条件的话呢,直接就跳转了是吧。
15:21
行,这就我们说的语法上的这个结构,在咱们自解码文件这里边呢,该怎么去解读,行,那么关于控制转移指令,咱们就说到这儿。
我来说两句