1

我已将代码片段翻译为 IJVM,但不确定它是否有效。告诉我我做得对不对。或者我如何检查代码是否有效。这是代码。

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

这是我所做的 IJVM 代码://以下 3 行设置 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 放在堆栈上,但从不使用该值。

当 A < X 时,第一个 GOTO L1 会导致无限循环。删除它。让代码落入循环体。

BIPUSH 1 代替 IPUSH 1

而不是 ISUB 后跟 IFEQ,使用 IF_ICMPEQ。

你有正确的想法。

要测试代码,请进行手动跟踪。用笔和纸写下变量 A、X、SUM 的初始值。在您逐步执行代码时更新变量的值(在列中)。

于 2015-11-10T21:55:54.980 回答