MIC1 アーキテクチャの IJVM でいくつかの整数の絶対値を計算する簡単なプログラムを作成しています。ここにあるエミュレータを使用しています。
コードは次のとおりです。
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
ます。ただし、2 番目の呼び出しはそうではなく、 を出力します0x77
。
エミュレータを使用して命令ごとにスタック フレームを観察すると、2 番目の ILOAD が最初の命令0x00000000
ではなく、スタックにプッシュされてしまいます。0xffffffc0
これは、関数の最初の呼び出しのみが実際に適切な値を出力することを意味します。
0x00000000
後続の呼び出しで代わりに出力する理由を誰かが知っていますか?