00:00
下面呢,咱们举一个例子啊,来方便大家对PC寄存器呢有一个更好的理解,那我在这个PPT当中呢,其实也写了一个代码,呃,有一个简单的例子,这块呢,咱们直接来写一个例子啊好,那咱这呢现在是第四章,诶,所以我就在这个CAPTURE4当中,诶,我们去写个代码啊,这个包下边我们现在创建一个class,咱现在讲的叫PC啊,Register。哎,关于它的一个测试啊,这样行,然后这里边呢,我们就写一个普通的main方法就可以了,我现在呢,定义这样的几个变量啊,Int一个I呢是十啊,Int呢接呢是20啊in k等于,比如I加上J,好,我呢就先暂时呢写这样的三行指令啊,三行指令写完以后呢,我们先对它进行一个。呃,Re compile啊就可以直接呢做一个编译。嗯,可以了,那编译完以后呢,我们看一下,诶编译以后的这个词解码文件哈,是存放在我们这个al的目录下,大家做一个刷新,诶然后呢,在这里边咱们就能够看到,诶咱们刚才呢,写的这个Java代码呢,呃,编译以后生成这个资金码文件哈,然后呢,我们在这块呢看一下,咱可以再重新新开一个logo,嗯,找到我们当前的这个目录。
01:15
CD,然后下的。Production。哎,我先这个回车一下啊,然后在下边儿呢,再进入。诶,这个目录下好,然后呢,我们javap这个咱们已经前面说过了,这是进行一个反编译操作,Javap呢杠V啊,或者你叫我boss也可以啊,然后呢,PC。Register。test.class。好,那回这以后的话,我们就会看到,哎,当前咱们这个程序呢,反编以后这样一个结果,诶,咱们就能看到相应的这样的几个指令了啊,那这个指令里边,呃,咱们看一下这里边的这个过程啊,诶这个我调一下我的这个画笔。
02:06
重调一下啊,嗯,这块大家看到了,这呢,就是咱们刚才写的这个没方法,在这没方法里边呢,你看就我们刚才这样的几个操作哈,哎这呢,我们取了这个数十,然后呢,把它保存起来,保存到我们这个索引为一的位置啊,然后呢,我们又诶定义了一个20,把它呢,诶放到我们索引为二的这个位置上。诶,然后下边呢,我们把它两个取出来啊,做一个加和的操作啊,再保存在这个索引为三的这个位置上啊return呢,表示我们这个酶方法呢,就结束了啊,这是我们的这样一个过程啊,哎,这个大家也都能看得清楚,是关于这个main方法的行,那么左边这块,哎,大家看到有这样的一串数字啊,0245等等啊依次往下,那这串数字呢,其实就我们所说的这个叫诶指定地址,或者我们也称作叫做偏移地址啊,那这个偏移地址指定地址就是咱们PC寄存器当中所存储的这个结构,那右边这块呢,咱们可以理解成它叫做操作指令啊,BI push啊,I storere,具体指令呢,咱们到后边讲到这个虚拟站的时候呢,还会来提啊,暂时呢,咱们先不过多的去深究,主要呢,大家关注于左边这一栏就行啊,那咱们这里边呢,再引入引入几个其他的结构,比如说我们定一个string类型的字符串。
03:23
那这个来一个ABC。但是呢,我们比如输出一下这个I。诶,输出一下这个,比如说K行这呢,我们又多了几行这样代码,我们重新的再做一个re compel啊重新的编译一下。诶编译完以后呢,我们再重新执行一下,刚才咱们这个程序,哎,咱说了这个程序呢,前面大家用这个这个杠V啊也可以。啊都行啊行,那执行完以后呢,我们就看到呃,这个程序了,啊这个程序呢,现在我们又多了几行代码,主要呢,咱们关注的还是此时的这个没方法。
04:00
啊,那上面呢,其实还有一些这个常量池,你看我们下边呢,就有这个引用啊,嗯,还是呢,整个咱们这个没方法的一个执行过程,下面呢,因为咱们涉及到这不是又定义一个字符串啊,那这呢有一个呃,第十行这块有一个LDC啊这呢表示就是从常量池当中啊,咱们取一个这个常量啊,取一个常量这个呢又对应到这个叫井号二啊这个井二呢,其实就对应我们后边内容,这个井二是谁呢?哎,往上找。来找我们这个常量池的这个符号,井号二呢,指的就是这个string啊,String呢这块又指了一个井号27啊,因为27呢就存着我们字符串常量池里边的具体的这个数据啊,叫做ABC啊是这样子的,诶这呢就对应的是咱们的这样的一行操作,诶这样操作里边其实我们又具体的去找到string,又找到ABC,诶相当于有两个操作一样,所以下边呢,你看直接就变成是12了,诶12呢把它做了一个保存,相当于是啊。呃,然后接下来呢,我们接着又取的这个,呃,这个不是取了这个是我们要打印一下这个I的这个值,诶这呢,打印这个I,我们说涉及到system,涉及到它的属性out,哎又对应的是一个print stream打印流,哎再去调打印流的这个方法,哎,又会指向这个井三,哎再往上面去找。
05:19
诶景三呢,对应的是我们一个属性,诶28啊点29,哎,那接着到这找28 28呢是我们说的这个叫哎二十八二十九啊28呢,这就指到34了,34呢指的就是我们这个二八二十九二十九啊又指到35啊是。Out是吧,哎,Out,诶35有36OUT呢,它是一个print stream这个类型啊,相当于把这个类型呢,又引入进来了,哎加载了这个类,诶这呢就是咱们看一下反编以后的这个字节码的这样一个情况啊,那咱们把这个位置啊稍微的截一下。哎,这个我简单就把这块啊到这吧。这样的啊,稍微的截一下,哎,咱这儿呢,再哎放一个图。
06:05
CTRLV1下行,这呢,我就粘过来啊放到这儿,呃,这个里边呢,咱们刚才说了这个第一列啊,就这一列啊,这个我们给它称作啊,就叫做指令地址。哎,或者呢,我们也可以把它称作叫偏移地址。就他。这个稍微有点长了啊好,指令地址或者呢叫做偏移地址啊,这个指针啊,就是指向它这个结构的,嗯,那顺便呢,咱们把后边这个结构呢也说一下啊,后边这块呢,我们看到这样的一些,呃,算是叫字符串了啊。往左边诶。这个算是叫字符串一样,其实这呢,就是我们具体的一些指令了啊,咱们称作叫操作指令。呃,准确的说呢,咱们后边讲到这个字符串的,呃,讲到这个这个字解码的时候啊,就是我们这一篇的下一篇第二篇的时候,咱们会把这里边的一个一个的都会带大家说一说的啊,这个详细的细节其实非常多,大家看Java虚拟规范的话,其实这个书的一半呢,其实都在讲这些具体的字解码指令啊,这个呢,我们叫做操作指令。
07:21
行,这就可以了,那么举个例子,咱们取其中的一个,比如针对这个五。呃,针对他来说,那我把它这个颜色呢换一下。和那个蓝色的。啊,那这个五的话呢,我们就可以理解成它就是呃,咱们的叫PC寄存器里边所存储的这个数据。那这个数据呢,我们就放到这儿。哎,这个咱们叫IPC寄存器,或者我们叫程序计数器啊都可以。他呢,就把我们这个数据呢,就诶存到这儿了,诶放到这个位置上啊,这是一个五。
08:01
哎,就放在这了啊,那这个五的话呢,咱们就会使用谁呢?呃,再提到一个结构叫做直径引擎。哎,直行引擎执行引擎的话呢,它会去读取这个,咱们用这个黑色的吧,会读取咱们或者它会去我们这个寄存器啊,PC寄存器里边所代表的这个五的这个位置呢,去取这个指令。啊,就是他去我们这个啊,PC寄存器的这个,它指向的下一个这个这个指令地址这个位置呢,取出我们对应的这个操作指令叫is到二,诶我们把这二呢做了一个保存,放到咱们的这个局无变量表里边了啊进行了一个保存,那么这个操作的话呢,其实接下来包括我们这里边一系列这个操作指令啊,它会涉及到我们这个执行引擎啊,它要做呃两个事儿啊,第一个呢,它会去操作咱们相应的,呃,这个我们就先简单的来说一下啊会接着呢来操作咱们说的这个站结构啊,主要的就是虚虚拟基站了操作我们写叫哎局部变量表。
09:12
哎,以及呢,咱们说叫哎操作数站。哎,这样的结构实现数据的一个存啊取啊,诶这样的一系列操作,哎,包括呢,咱们可能还有一些像这种加ii的这样一些操作,把它做一些这个求和的运算,这里边还涉及到一个操作呢,就是诶我们需要把咱们现在看到的这叫自解码指令呢翻译成。啊,翻译成我们说对应的这个叫机器指令。哎,翻译成这个,诶机器。16。这样然后这个机器指令呢,我们就可以让对应的这个CPU呢,诶帮咱们做运算。诶,是这样的一个过程。哎,这就可以了啊,就是大家呢,诶整体对它有一个理解,这呢就是我们说这个PC寄存器它的一个意义啊,再回过来我们体会一下啊,前面我们提到了,它就是来存储我们下一条指令的一个地址啊,用来指明咱们执行引擎呢,要取这个地址啊,去做相应的一些操作了,诶我接下来该执行哪一行代码了呢?诶,我们从PC寄存器当中来取这个地址啊就可以了。
10:21
行这呢,就是咱们这个一个举例啊。
我来说两句