1

コード フラグメントを IJVM に変換しましたが、機能するかどうかはわかりません。私がそれを正しく行っているかどうか教えてください。または、コードが機能するかどうかを確認するにはどうすればよいですか。これがコードです。

a = 0 sum = x  
while( a<= x){
sum += a;
a++;
}

これが私が行った IJVM コードです: //以下の 3 行 set a = 0

ILOAD a  
BIPUSH 0 
ISTORE a
//following 2 lines set sum = x
ILOAD x
ISTORE sum
//checking the condition of the loop
L1: ILOAD a 
ILOAD x
ISUB
IFEQ L2 //GO TO BODY OF WHILE LOOP
ILOAD x
ILOAD a
ISUB
IFLT L3 //GO OUT OF WHILE LOOP
GOTO L1 
//L2 IS THE BODY OF WHILE LOOP
L2: ILOAD sum
ILOAD a
IADD
ISTORE sum
ILOAD a
IPUSH 1
IADD
ISTORE a
GOTO L1 //AGAIN GO BACK TO CHECK THE CONDITION OF WHILE LOOP

L3:
4

1 に答える 1

0

最初の命令 ILOAD A は必要ありません。A をスタックに置きますが、値は使用されません。

最初の GOTO L1 は、A < X の場合に無限ループを引き起こします。削除します。コードをループの本体に落とし込みます。

IPUSH 1 の代わりに BIPUSH 1

ISUB の後に IFEQ が続く代わりに、IF_ICMPEQ を使用します。

あなたは正しい考えを持っています。

コードをテストするには、ハンド トレースを行います。ペンと紙を使用して、変数 A、X、SUM の初期値を書き留めます。コードをステップ実行するときに、変数の値を (列で) 更新します。

于 2015-11-10T21:55:54.980 に答える