我正在编写一个简单的程序来计算MICJ架构的IJVM中几个整数的绝对值。我正在使用位于here的模拟器。
以下是代码:
BIPUSH 0xC0
DUP
ISTORE i1
ISTORE i2
LDC_W OBJREF
ILOAD i1
INVOKEVIRTUAL
OUT
LDC_W OBJREF
ILOAD i2
INVOKEVIRTUAL abs
OUT
其中abs是计算整数绝对值的方法。
第一次调用abs工作正常并正确计算0xC0
的绝对值,输出0x11
。但是,第二个调用没有,并输出0x77
。
当我使用仿真器逐个指令观察堆栈帧时,第二个ILOAD最终将0x00000000
推送到堆栈而不是0xffffffc0
,就像第一条指令一样。这意味着只有函数的第一次调用实际输出正确的值。
是否有人知道为什么它会在后续调用中输出0x00000000
?
答案 0 :(得分:0)
经过一番调查后我解决了这个问题 - 方法中有一条未正确使用的指令。