2

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

100 + 11 = 111

在 ijvm 中翻译所有内容:

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

在不对代码进行任何更改的情况下,变量 i 的内容是什么?正如他们在 ijvm 数字中所代表的那样?一个简单的加法就足够了?为什么我需要右移或左移?

4

1 回答 1

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

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

于 2015-11-10T21:35:56.453 回答