假设我们需要在ijvm中生成两个二进制数的总和,例如:
100 + 11 = 111
在ijvm中翻译所有内容:
ILOAD arg1 //100
ILOAD arg2 // 11
IADD
ISTORE i
不对代码进行任何更改,变量i的内容是什么? 因为他们用ijvm数字代表?一个简单的添加足以赚一笔钱?为什么我需要右移或左移?
答案 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| |
在网格中,显示算术的结果,不包括溢出。圈选导致溢出的条目。这样的表可能会为您提供检测溢出的线索,而无需查看进位。