基于栈
学习自
https://blog.csdn.net/jijianshuai/article/details/73739995
代码
public static int add(int a, int b) {
int c = 0;
c = a + b;
return c;
}
字节码
descriptor: (II)I
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2,locals=3,arg_size=2
0: iconst_0
1: istore_2
2: iload_0
3: iload_1
4: iadd
5: istore_2
6: iload_2
7: ireturn
LineNumberTable:
line 5: 0
line 6: 2
line 7: 6
LocalVariableTable:
Start Length Slot Name Si
0 8 0 a I
0 8 1 b I
2 6 2 c I
(假设我们输入的方法参数是10,20)
0-7:
本地变量表有3格,分别对应abc
在读到0的时候,0压栈
0赋给c的时候,0出栈,存到c在本地变量表对应的那一格中
10压栈
20压栈(这里得出栈深为2)
执行到10+20的时候,10,20出栈,相加后30压栈
30出栈,存到c在本地变量表对应的那一格中
c在本地变量表对应的那一格的数压栈
返回结果30
基于寄存器
学习自
https://blog.csdn.net/u012481172/article/details/50904574
这个时候不同于基于栈,所有的变量都是放在寄存器里的。所以我们就必须去得到每个操作数在内存中的地址了。
如果想R3=R1+R2
对应的指令直接ADD R1 R2 R2;即可完成
比起JVM,节省了许多指令。速度自然快上许多,所以特别适合硬件受限的移动设备。