00:00
那接着呀,咱们来看一下这个叫条件跳转指令,说呢,在条件跳转指令执行前呀,一般呢,先用比较指令进行占顶元素的一个准备,然后呢进行条件的一个跳转。那比如说呢,咱们这块涉及到整个这个站点的两个数据,假设呢,这是一个double类型,这呢是一个float型或者一个double型,比较一下这两个数谁大谁小,怎么办呀,咱们是先使用这个比较指令。就刚才提到的,比如说DCMP,比如是G啊,是L啊,对吧,我们先进行它俩的一个判断,判断完以后呢,我们会压入一个是不是要么是E,要么是零,要么是负一这三个数,那这三个数接下来就可以使用咱们下边提供的这些指令来进行判断了。那float类型,Long类型都同样的道理,那有同学说老师那那个int类型的这个int类型啊,准确的来说,这个得看看你是怎么比,你想跟零比,那就是用也是咱们这些,你要是呢,说判断它大这个I类,Int类型的一个I1,一个I2,说它俩谁大谁小,这个呢,其实准确的说呢,是咱们下边要讲的叫比较条件跳转指令。
01:09
就是定位到这儿了,那这儿呢,我们涉及到你看这个是不是主要都是I啊,这个I呢,就是我们所谓的这个in的类型。行,先别绕了,咱们先回过来一点点来啊,这个大家别晕了,咱们先把咱们这一组条件调整指令呢先说清楚。大家看条件跳转指令呢,主要有这么一些,这儿呢,我要是再分一下组呢,还可以再分成两组。再分成两组,后边这俩,还有前面这几个,前面这几个呢,咱们也进行了剖析,它这个名字呢,也是其实有一定的这个意义在里边的。这个if呢,不用多说了,后边这个EQ呢,就是ES的意思,就是是不是相等跟谁比啊,比如说刚才我们两个这个double部型的值进到站里边了,最终呢,弹这个再加入一个负一啊零啊或者一,那这三个数呢,咱们跟一扣一扣跟谁啊跟零去比。看一下你得到的这三个可能中的任何一个跟零比,如果呢,要是等于零呢,咱们就跳转,跳转就是咱们一会儿一看这个最简码指令就知道了,就是你要是零就跳转,这个就是equal的意思,然后LT呢,就是这个lower than lower than就是小于的意思,对吧?所以这个lower than就是它,然后是不是小于零的意思,小于零就跳转,然后这个呢,就lower and equals,就是小于等于的意思。
02:24
没问题,然后这个呢,就是none equals就是非零,那就是不等于零的意思,然后greater than,还有greater than and,或者an all啊,Equals就是大于等于。这个是大于OK,这个呢,就我们说的这五组,哎,这六组,然后后边这个if no和if now闹呢,就是是不是等于no,如果是闹的话呢,就是跳转,如果不是no呢,下边这个呢,不是闹的时候呢,跳转。那其实这意思呢,应该是比较好理解的行,那具体这块跳转呢,就是跳转到我们先后边对应的那个,又指定了一个相应的我们最金码偏移量的一个位置啊,便移量那个off嘛。
03:01
然后这块你就偏移到指定那个位置就可以了。啊,统一的一个含义这块写了弹出站井元素,测试它是否满足相应的这里边某个条件,如果满足这个条件呢,我们就跳转到你给定的那个偏移量的那个位置,啊,这就是整个这样的一个规则。啊,这样的一个规则,那对于这个波尔bet差short呢,都按int型来进行处理,那int类型呢,就是看看你也是跟零去比的这样的一个情况。那如果呢,要是这个long float double,咱们刚才说了,嗯,这个为什么说非得跟比较运算符去结合使用呢?这个主要是因为这三种类型,咱们得先比较得到一个一,零或者负一,然后呢,再去跟我们这里边儿这个数据做比较。所以呢,整个咱们在这个指令集当中啊,针对int类型呢,其实是最多的,包括咱们下一组大家会发现呢,前边的这个到这这些,你看这里个这个I是吧,这个I呢,就是int类型的意思,那也都是跟int相关,没有别的类型。
04:00
行,其实说到这儿呢,大家我想应该是晕了不少,这个咱们赶紧的来看一下这个题目,那一看题目呢,大家就清楚了。啊就清楚了,你像这个呢,我在这个看这些指令的时候呢,其实关于这个跳点这块呢,这个相应的例子呢,很少,就是一点点的把这个例子呢,就是抠出来,然后包括这个官网的这个西安的这个解释是吧,就得一个一个去看,然后呢剖析才可以,那再给大家讲的话呢,我觉得大家理解起来应该是比我当初一点点看应该是要简单很多了,来你看我这块呢讲解你看能不能清楚,首先的话呢,把当前我们这个代码呢,进行一个re compel。然后的话呢,这块我们来查看一下当前这个资金码指令的一个反解析的结果,咱就按照这个顺序条件调转指令,第一个COMPARE1把它打开,好在这行在这查看,像我们比较熟悉的这个count store load呀,这个咱就叫加载与存储指令是吧,应该都很熟了,在我们讲每一组里边其实都会涉及到这个,这个加载与存储嘛,毫无疑问这个频率是最高的。
05:01
首先这块我们一进来,这个我们画一个简图吧。这是操作入站,这个是局部变量表行,那第一个位置呢,当然毫无疑问这还是个Z对吧。行,那一进来的话呢,I cost0这呢我们就放了个零,然后呢,就I store1把这个呢,存储在我们这个角标为一的这个位置啊把零就放,这其实就是我们这个小A吧,行,再接下来的话呢,叫ILO的这个就它就有这个出站了,然后ILO1把我们这个零呢,相当于再加载进来。那加点进来这个一了,嗯,这个角标一了,然后下边呢,If ne ne呢,就是那一口就是不等于的意思,判断一下你这个值啊,是不是不等于零,就这个意思,那如果这个条件满足的话,我们就发生跳转,跳转到偏移量是12的位置,也就是这。注意这块大家一定要注意听我现在说的是什么呢?就是一旦呢,你这个是ne嘛,Ne就是那equals就是不相等,如果要是不等于零的话呢,我们就跳转,那我们现在显然看是不是这个式子不满足吧,不满足对吧,不满足的话呢,就是这个不满足这个条件,那我们就不跳转了,不跳转意味着呢,就是我们就直接呢往后走,往后走就执行这块,那这个呢,因为你也判断完了它就没了,接下来呢,叫b push一个十,把这个十呢压进来。
06:20
没问题,然后S到一,那这个十呢,再保存到这一的位置,那这个就从零就改成十了,这个呢也就出站了。嗯,这个到这了,对吧,到这儿以后呢,下边有个got To Got to呢是咱们这一题要讲的最后一个指令,就是无条件跳转,直接呢就跳转到这个15 15到这就return就结束了。对吧,就结束了,你看相当于最终的效果呢,我们这个A的值是不是十啊,你看在咱们这个程序这块来看,A是零,A等于零嘛,等等于,然后呢,A不就是十吗。是不是非常清楚,所以这个结果你看跟我们这呢是完全匹配的,那有同学说想再看一看,那比如说这块我们写一个不等于十,哎不等于零,这要不等于零的话呢,整个这个A是不是该复值为20了,那咱们再重新再做一个编译。
07:06
这块呢,我哎,我给你这样盯一下。哎,等一下啊,我的光标。行,我这块盯一下,我放在这儿,现在注意我刷新,好大家发现呢,这时候你看主要的区别是不是就这块儿变了。没问题是吧,这块变了,行行,现在咱们分析一下,那刚才这个主要的过程呢,跟刚才还都是一样的,然后这块呢,是个Z4,这个呢是一个A,然后一开始是零,然后这个L的角标一,然后把这零呢,这就拿进来了,接下来呢叫e equals equals的话就是你这个零呢,是不是是等等于我们说这个零的。就是不是跟零相等,那这个事儿呢,大家注意是不是满足啊,满足的话呢,我们就发生跳转,那跳转到哪呢?就跳转到这个偏移量是12的位置,那12的话呢,这不就到这儿了吗?这个时候呢,我们就往这个站里边是不是压入一个数值叫20啊。
08:04
然后压入20以后呢,把它保存在我们刚才还是这个I是这个角标一的位置是A,然后把这个20呢,这不就保存在这吗。那接下来我们就return结束了,那最终结果呢,就是我们A的值呢,这不就是20吗。能清楚对吧,所以这里边呢,我们就关于主要的核心就是它如果这个要满足这个条件呢,我们就跳转,就是按照你指定那个偏移量offset呢就跳转,这如果不满足呢,你就接着往下走,往下走通常呢都会有个goTo Goto的话呢,一般也都是看你还有没有别的具体细节操作,如果后边还有一些固定操作,那就goto到那儿,没有没有就return。行,这是第一个,可能有的同学清楚点了,有的可能还是有点迷糊,来咱们再看下一个,下一个这块呢,咱们说的呢,是这两个。这两个这两个人就是跟你是不是no来进行一个比较的,行来过来把这个compare now呢我们打开。这呢,我们传了一个字符串,看这个字符串呢,是不是个no,如果要是no呢,你就输返回这个是true,如果呢不是,你就返回一个false,对吧,挺清楚的,这呢是。
09:09
求变量表,这呢是咱们说这个操作数占行,首先呢,这个角标零角标一,这呢是一个Z对吧,然后这个ST2呢。它放在这儿,这个假设咱们现在写一个吧,比如我们这个位置假设就是no啊,就是no的情况下,因为我们调离方法,你肯定要传一个实参,那假设我们现在传过来就是个no,首先呢,把你这个LOAD1这个now呢,我们放到这儿。翻过来,然后呢,If呢,闹判断一下你这个闹呢,是不是这个none是不是不等于是不是不等于闹呢。显然这个是不是不满足啊,如果不满足的话呢,咱们就不要跳转了,就直接往下走,那就是我们这块它出站了,然后这块呢,Icon这放个一,然后I return,那就把这个一返回。呃,一返回这是个处对吧,那一的话呢,我们说对应的其实就是处呢,对应的其实就是一嘛,所以返回的就是它。
10:02
注意返回它啊,那如果说我们这个写的是一个,比如说ABC这样一个字符串。其实这个字符串的话呢,我们把ABC呢,现在就拿过来了,ABC不等于no,这个事呢,是不是满足啊,满足的话呢,那我们就按照这个跳转来,那就到六了,直接就蹦到这过了这个四跟五了,直接蹦到六,那这块呢是个零,把零呢就压进来了。然后呢,I return就返回零零,所以呢,就是false没问题。能理解是吧,行,这我们说的比较基本的这几个指令,然后呢,咱们下边这块呢,相当于就是叫结合比较。哎,结合比较这个指令这个来使用啊,来看一看这个COMPARE2。C2,那这块呢,稍微就多一些了,咱们现在呢是float类型的俩数,看看谁大谁小,OK吧,那这块呢,方便起见,咱们CTRLC一下,在这给大家写一写吧。
11:05
好,我把这个指令呢粘过来,然后把它稍微放大一些,把代码呢咱们也粘一下。诶,这个这儿是吧。好来分析这个过程,那compare的话呢,这个一上来这个位置是个Z,这不用多说了,对吧,这个Z具体的就是当前这个对象它的一个地址值,这个我们就不处理它了,在下边的话呢,我们这个先看这首先呢LDC这来一个9.0,那放到我们这个位置。9.0对吧,嗯,这个咱们是一个黑色的。行99.0的啊。这个咱们都把它选中一下。选择一个单元格的格式。选一个文本吧,或者选一个自自定义的类型也行,那就是。00点。零这样。
12:00
再改一下。0.0是吧。行,这个呢,就是我们相当于往这个操作站当中,我们压入了一个9.0,然后呢,把这个呢,保存到我们这个角标为一的位置,那就相当于就到这儿了9.0,那这是一个它它相当于啊这个9.0,这也得改一下。这个我们改成一个文本吧,文本它倒省事一点,我们写啥它就它就是啥对吧。嗯。行,这呢是一个9.0,它其实对应的就是我们这里边儿这个F1,这个大家知道这个事儿就行,那因为呢,你把它保存起来之后呢,这个操作站中它呢就不存在了。这个灰色了,那接下来呢,又来了一个数往这一放,这个呢叫10.0。嗯,这个10.0的话呢,接下来也给他做了一个F到这个放到这个二的位置的。12点。F2没问题,那这个呢,相当于他也就出战了。
13:03
再接下来的话呢,Get static这个我们把system out呢进来。那加进来。好,下面的话呢,F6的一把我们这个9.0呢,给它也压进来。然后下边呢,F2把这个10.0呢也进来。那这个都过来了,这个数据呢还在,然后再下边呢,你看FCMPG这个呢,不就是咱们刚才那会提到的叫比较运算符。标用图啊FCMPG对吧,就它行,那这时候比较注意,咱们刚才那会讲这个运算符提到过,把它呢看成是V1,把这个看成是V2,我们在调用这个指令的时候呢,相当于它俩呢,就都出站看一下这个V1跟V2的关系,如果V1目前来看是不是小于V2啊,V1如果要小于V2呢,我们就要返回负一。就要返回负一,回过来看一下咱们这个指令是不是V1要大于V2,是1V小于V2,是不是负一没问题对吧?行,那回过来这两个呢,就出去了。
14:06
出去之后呢,压入了一个负一。啊,这个还有个涨幅1.0,这个不理想。啊,这块呢,咱们类型那还是改成是一个文本的比较合适。主要我就想整成文本呢,他这老是有一个这个尖儿是吧,这个啊行,那这呢,我就改成那个负一了。嗯,就是负一没有点零,然后这个负一进来之后呢,这个是我们这个判别之后的一个结果,在下面呢,叫e gg呢叫greater or equal,就是等大于等于的意思,我们判断一下这个负一呢,是否大于等于零。对吧,跟零去比较的,显然这个事儿是不是不满足啊,这要不满足的话,那就不要跳转了,那就直接往下走,那这个本身它比较完以后也就这个出战了,那往下走的话呢,就是我们就又加入了一个。
15:00
常数是吧,这个常量呢叫做一,这一呢,是不是就压进来了。压进来之后呢,我们再勾出一下20 20呢,就这相当于我们就调用一下system.al的对应的那个打印流里边那个print方法,然后把这个一呢,是不是给它输出。那输出这个我们回过来一看,这块输出输出,诶,我们这输出不是一啊,咱们想输出的不应该是一个波尔类型的吗?那这时候大家就注意到另外的一个小的细节,咱们这块调的呢,是print方法,是我们常量池里边这个索引为五的这个位置,来咱们找一下索引为五的位置,索引为五这个位置呢,大家会看到咱们调的这个方法引用它是print stream打印流里的这个方法的名呢,叫print line,它的这个描述注意。它的描述括号里边是Z啊,应该还记得咱们前面讲各个类型的时候呢,这个Z是不是就是布尔类型的呀。OK吧,那也就是说呢,咱们在这个print stream这里边,它有很多重载的这个方法,对吧,Print stream这样的一个打印流里边。
16:06
那咱们呢,现在想调的是print line,那它有一系列重载的方法,咱们现在用的呢,其实就是这个,所以呢,虽然你看到是一,但是我们用的是这个操作,他就把这个一呢叫翻译成是true。那不是掉的其他的一些行,这个呢,大家应该就清楚了,那实际上我们来看一下,这是九,这是十,它小于它嘛,这个结果是不是也确实是一个出啊。那这就没有问题了。行,这应该就OK,那相应的你如果把这个改成是一个大于的话呢,这就是false了,那相应的我们这个指令呢,也会做一些这个变化,对吧,这样呢,我就不用那再来强调这个问题了,大家应该能够理解这两个事儿,好,那下边咱们再举一个场景,就是这里边的例子啊,都非常具有代表性,那每一个呢,都是我自己这个亲自这块呢,有一个一个的去构建出来的啊,每一个代码呢,都有一个它特殊的一个,嗯,考察的一个角度,那我们来看一下这个COMPARE3这个角度呢,就是我们这有一个int型,有个long类型。
17:03
有一个int有个棱对吧?呃,这两个在比较的时候呢,注意是不是涉及到一个数据类型提升啊,或者我们叫一个宽化类型转换,对吧?来。咱们看一下这个COMPARE3这里边的。K3这呢,我就不用咱们这个Excel来画了,稍微慢一点,咱们直接呢画一个简图,整体这个过程应该都清楚啊这个这呢是局部变量表操作数占放过来,然后B是一个十拿到这儿,然后把它呢保存在角标是角标012这个往后顺一个保存,这这呢放个十,其实呢就是咱们这里边的IE。A1没问题,然后这个呢出来了没问题,然后下边呢LDC,然后二这个杠W20,这个20呢,因为它是个浪类型的嘛,是吧,所以我们这有一个这个二啊,那这呢是一个20进来,这它是占两个槽位的,这个稍微关注一下。然后把它保存到我们这个角边为二的这个位置,那这呢就是一个20,那其实它呢,是不是也占用的是两个槽位,这块小心一点。
18:03
嗯,在接下来get static这个也出去了,下边呢,再进来一个叫system.out system.out嗯,先放这儿,然后I1那一把这个十呢拿过来。然后呢,Li to Li,咱们现在进行比较的时候呢,它俩类型呢得是一致的,所以这时候呢,因为你是个int型,那是一个long类型,所以int呢叫呃宽化类型转换,那这时候呢,我们就把这个十呢,相当于它出来,然后变成一个浪才进来,相当于这时候它就占了两个草位。OK吧,然后这个完了以后,接下来呢,我们再把这个这个所以为二的这个位置呢,也拿过来,这不20就进来了嘛,它其实也是占两个这个具体的草位,然后接下来是LCP。这呢又是一个比较操作谱,那这个看成是V1,这个看成是V2,那么V1显然是不是小于V2啊,这个十小于20嘛,所以说呢,我们这个是不是在把它俩都出站之后呢,压入了一个负一吧。负一压进来之后到哪儿了?
19:00
到这了,负一压进来之后呢,下边一个叫if,这个GE,这个稍微挡住了,GE呢叫greater or equals,就是我们这个负一呢,是不是大于等于零呢。大于等于零,不满足吧,不满足的话,那就不要跳转了,那就直接往下走,往下走这呢就。这个负一也使用了,然后往下走呢,这块是不是加入了一个一啊。啊,压入了个一之后,Goto一下22,那就直接蹦到22这块,就相当于是调我们C点奥对应的那个普方法,然后把这一呢给它转过去那一,那咱们这是一个波尔类型的一,是不是还是处的意思啊,所以这个结果呢,就是个处。那十小于20,那确实是不是也是个除啊。没问题的是吧,那如果我们要把这个改成是一个大于符号。那大于括号看我改了对吧,咱们再重新做一个编译。我把这个呢,给你这样盯一下。放到左边。我这块刷新,大家你看一下这个瞬时的一个变化,主要是就看这块儿了。
20:00
好,你看这块是不是变了行,那这个时候的话呢,你看咱们还是啊,刚才提到那个,嗯,这边也有一个I tol,然后这个S点的是不是体现都进来了,然后这呢,还是一个十,嗯,它是这不用的是一个两个槽位的,然后上面还是个20对吧,两个槽位的行,然后的话呢,这个十,呃,这个是LCMP10小于20嘛,这个不满足,咱不是压入一个负一嘛,再接下来呢,这叫lower and equal4。Lower or lower or equal4就是是不是呢叫小于等于零这个满足,满足的话呢,咱们就直接跳转到21这。就跳转到这儿,就是你这个偏移量,这不是21嘛,这个14加个七不就21嘛,嗯,那跳转到这儿了,调这以后的话呢,我们这个是个零负一出去之后呢,压进来一个零,然后接着往下呢,输出一下这个零,那其实对应的方法还是打印那个布尔类型的,那这时候零对应的是不是就false啊,那这个结果是不是也确实是false吧。哎,就是这个意思。哎,这个大家通过刚才这个讲解是不是更清晰了,那咱们再举一个这个double类型的,这呢就嗯咱们快点说了,这个D的话呢,看它是不是大于50,假设呢,这个D我们复值为20.0,那相当于呢,这是有一个20.0,这呢有一个50.0,那这不又是一个DCCMPL,它俩的话呢,V1小于V2小于V2这块我们它俩一出是不是压入一个负一对吧,那负一的话呢,再判断一下是不是叫小于等于0LOWER。
21:28
哦,一扣400加点零满足满足呢,直接跳转,跳转到这这个呢,就是负一的意思吧。I return叫负一,那这个呢,确实是负一,因为20.0大于50嘛,不不大于,那这我们返回不也是负一吗?就这个意思,行,那通过刚才这样举个例子,大家呢,熟悉一下,咱们一个呢,叫。比较指令啊,一个呢叫条件挑战指令。看是不是清楚点了。我再啰嗦一句啊,这个比较指令这块呢,你看针对的都是我们说的是这三类。是这三类对吧,那这三类你要比较谁大于谁小于,像我们这里边儿的这个场景。
22:05
这个场景。这个这个场景,包括这个场景在内,因为这呢,把这个int是不是转换成浪了,那像这个这三类的话呢,咱们都使用的,其实用到了他们这些指令,这些指令用完之后呢,得到的是正一负一或者是零,再跟咱们这里边儿的。零这块去比较,那如果你要本身就是int类型,或者呢,你是波尔be short的差,这个时候呢,咱们直接跟零去比的话呢。咱们这块这不是有这个例子吗?直接跟零去比,那直接呢,就是用这个条件跳转直令就行,那有同学说老师我看到你这块呢,少一种例子,有没有大家发现我少个什么例子呢?如果我这是一个in形的I,这是一个in特型的阶,两个in的类型比较谁大谁小,那注意这块呢是咱们下边要讲的叫比较条件跳转指令了。哎,是在这儿呢啊行,咱们先把这个停一下。
我来说两句