IJVM 中的简单求和

Simple sum in IJVM

假设我们需要在ijvm中对两个二进制数求和,例如:

100 + 11 = 111

在 ijvm 中翻译所有内容:

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

在不修改代码的情况下,变量i的内容是什么? 正如他们在 ijvm 数字中所代表的那样?一个简单的加法足以求和吗?为什么我需要右移或左移?

字节码看起来像

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| |

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