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 可能会为您提供检测溢出的线索,而无需查看进位位。
假设我们需要在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 可能会为您提供检测溢出的线索,而无需查看进位位。