【发布时间】:2013-04-14 21:17:32
【问题描述】:
我正在为 MIC1 架构编写一个简单的程序来计算 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?
【问题讨论】:
标签: java assembly jvm bytecode java-bytecode-asm