说明:我们有时把 指令系统层 称为
宏体系结构(macroarchitecture)
,以便与 微体系结构层 相对应。
1.栈
1)栈的用法有两个:一是保存局部变量,二是保存操作数。前者所组成的称之为
局部变量结构
,后者的栈称之为
操作数栈
。
2) 栈中的变量没有绝对地址,使用寄存器LV指向当前过程的局部变量结构的基地址。而使用寄存器SP来指向局部变量中的地址的最高字。
如上图,嗯。添加新的局部变量的话,则是在栈的顶部添加,相应的,LV、SP所指向的位置也会移动。
当然上面是局部变量结构的例子。下面举一个操作数栈的例子。
计算表达式:a1=a2+a3
第一步:把a2压入栈。
第二步:把a3压入栈。
第三步:将a2、a3弹出栈,计算,将结果压入栈。
第四步:将栈顶的字弹出并保存在a1中。
当然,局部变量结构和操作数栈可以混合使用。
虽然大多数计算机不使用栈来保存操作指令,但是,JVM要这样做啊。这就是为啥要了解操作数栈。
2.IJVM内存模型
当JVM启动后,就定义了4块内存区:
常量池(constant pool)、局部变量结构(local variable frame)、操作数栈(operand stack)、方法区(method area)
。
需要说的还有:SP、LV、CPP这些寄存器都是指向 字 的指针,不是 字节,所有偏移量都是字偏移量。而PC保存的事字节地址。即,LV+1指向的是下一个字(4个字节),而PC+1指向的下一个字节。
3.操作数与操作码
操作码
,其实就是指令序列号,用来告诉CPU需要执行哪一条指令。指令系统的每一条指令都有一个操作码,它表示该指令应进行什么性质的操作。不同的指令用操作码这个字段的不同编码来表示,每一种编码代表一种指令。组成操作码字段的位数一般取决于计算机指令系统的规模。
操作数(operand)
,是计算机指令中的一个组成部分,它规定了指令中进行数字运算的量 。操作数指出指令执行的操作所需要数据的来源。操作数是汇编语言指令的一个字段。例如:Mov AX 5678H 操作数(AX 5678H)。在操作数这个字段中可以放操作数本身,也可以放操作地址,还可以放操作地址的计算方法。
3.IJVM指令集
*:解释一下,表中每条指令都有操作码,有的还有操作数。第二列是汇编语言助记符,第三列是指令功能的人类语言描述。自己先略略地看完,之后的例子中,会用到这些命令。