IJVM中的简单总和

时间:2015-11-06 10:16:09

标签: cpu-architecture alu

假设我们需要在ijvm中生成两个二进制数的总和,例如:

100 + 11 = 111

在ijvm中翻译所有内容:

ILOAD arg1 //100
ILOAD arg2 // 11                
IADD
ISTORE i

不对代码进行任何更改,变量i的内容是什么? 因为他们用ijvm数字代表?一个简单的添加足以赚一笔钱?为什么我需要右移或左移?

1 个答案:

答案 0 :(得分:1)

字节代码看起来像

0x15 0x02
0x15 0x03
0x60
0x36 0x01

其中0x02是从LV到arg1的偏移量,0x03是从LV到arg2的偏移量,0x01是从LV到i的偏移量。

如果局部变量arg1为100且局部变量arg2为11,则局部变量i将为111。

在IADD

之前,堆栈看起来像这样
011 <- SP
100 <- operand stack starts here
011 <- LV + 3
100 <- LV + 2
xxx <- LV + 1
xxx <- LV

在ISTORE

之后,堆栈看起来像这样
011 <- LV + 3
100 <- LV + 2
111 <- LV + 1
xxx <- LV

您提供的代码将执行添加。你不需要转移。

对溢出评论的回应:

创建一个网格,用于添加两个2位数字。 00 01 10 11顶部和侧面。 | 00 01 10 11| 00| | 01| | 10| | 11| |

在网格中,显示算术的结果,不包括溢出。圈选导致溢出的条目。这样的表可能会为您提供检测溢出的线索,而无需查看进位。