为什么这个程序的结果return错误?
Why return wrong results this program?
我最近开始使用 HLA,我找不到这段代码中的错误。请帮助我的人。为什么这个程序的结果return错误?
该程序已完成,没有任何语法错误,但 return 个错误值。
procedure program(VAL i:int32; VAL j:uns16; VAL N:uns32; VAR tomb: int32); @cdecl; @use EAX; @returns("EAX"); @external;
procedure program(VAL i:int32; VAL j:uns16; VAL N:uns32; VAR tomb: int32); @nodisplay;
begin program;
// tomb[0]=i+(j*9);
// for (k=1; k<N; k++) tomb[k]=(tomb[k-1]+9)*j;
// sum=0;
// for (k=0; k<N; k++) sum=sum+tomb[k]/15+i-j;
// return sum;
PUSH(EBX);
PUSH(ECX);
PUSH(EDX);
PUSH(EDI);
PUSH(ESI);
//Tomb[0]
MOVZX(j,EAX);
INTMUL(9, EAX);
ADD(i, EAX);
MOV(tomb,EDI);
MOV(EAX, [EDI]);
MOV(EAX, ESI);
MOV(N, ECX);
for1:
DEC(ECX); //ECX = ECX - 1
JZ for1_end; //if ECX = 0,
ADD(9, ESI); //ESI = (tomb[k-1]+9)
INTMUL(j, ESI); //ESI = (tomb[k-1]+9)*j
ADD(4, EDI);
MOV(ESI, [EDI]); //tomb[k] = tomb[k]=(tomb[k-1]+3)*j
JMP for1;
for1_end:
//for (k=0; k<N; k++) sum=sum+tomb[k]/15+i-j;
SUB(ESI, ESI); // ESI (sum) = 0
MOV(tomb, EDI); // EDI = tomb cime
MOV(N, ECX); // ECX = N
MOVZX(j, EDX);
MOV(15, EBX);
ADD(i, EBX);
SUB(EDX, EBX); //15+i-j
for2:
MOV( [EDI], EAX );// EAX = tomb[k]
CDQ;
IDIV( EBX ); // EAX = tomb[k]/15+i-j
ADD( EAX, ESI ); // ESI = ESI+tomb[k]/15+i-j
ADD(4, EDI);
DEC(ECX); // ECX = ECX-1
JNZ for2; // if ECX=0,
MOV( ESI, EAX ); // EAX = sum
POP( ESI );
POP( EDI );
POP( EDX );
POP( ECX );
POP( EBX );
end program;
编辑:
我看不到 N
和 tomb
。从 i
和 j
我尽我所能 -->
1. test case (i=7830, j=348): result(for me):-15984526, correct:-1700110054
2. test case (i=7830, j=913): result(for me):-669363, correct:-231479087
3. test case (i=7830, j=3475): result(for me):4404210, correct:963858517
4. test case (i=7830, j=-6588): result(for me):-674954, correct:1719334650
5. test case (i=7830, j=29684): result(for me):-6505388, correct:-1490170292
// for (k=0; k<N; k++) sum=sum+tomb[k]/15+i-j;
鉴于此表达式,计算 15+i-j
并使用 IDIV( EBX ); // EAX = tomb[k]/15+i-j
将其用作除数是错误的
!
代数的一般规则规定您需要除以 15
,然后加上 i
并减去 j
。
我最近开始使用 HLA,我找不到这段代码中的错误。请帮助我的人。为什么这个程序的结果return错误? 该程序已完成,没有任何语法错误,但 return 个错误值。
procedure program(VAL i:int32; VAL j:uns16; VAL N:uns32; VAR tomb: int32); @cdecl; @use EAX; @returns("EAX"); @external;
procedure program(VAL i:int32; VAL j:uns16; VAL N:uns32; VAR tomb: int32); @nodisplay;
begin program;
// tomb[0]=i+(j*9);
// for (k=1; k<N; k++) tomb[k]=(tomb[k-1]+9)*j;
// sum=0;
// for (k=0; k<N; k++) sum=sum+tomb[k]/15+i-j;
// return sum;
PUSH(EBX);
PUSH(ECX);
PUSH(EDX);
PUSH(EDI);
PUSH(ESI);
//Tomb[0]
MOVZX(j,EAX);
INTMUL(9, EAX);
ADD(i, EAX);
MOV(tomb,EDI);
MOV(EAX, [EDI]);
MOV(EAX, ESI);
MOV(N, ECX);
for1:
DEC(ECX); //ECX = ECX - 1
JZ for1_end; //if ECX = 0,
ADD(9, ESI); //ESI = (tomb[k-1]+9)
INTMUL(j, ESI); //ESI = (tomb[k-1]+9)*j
ADD(4, EDI);
MOV(ESI, [EDI]); //tomb[k] = tomb[k]=(tomb[k-1]+3)*j
JMP for1;
for1_end:
//for (k=0; k<N; k++) sum=sum+tomb[k]/15+i-j;
SUB(ESI, ESI); // ESI (sum) = 0
MOV(tomb, EDI); // EDI = tomb cime
MOV(N, ECX); // ECX = N
MOVZX(j, EDX);
MOV(15, EBX);
ADD(i, EBX);
SUB(EDX, EBX); //15+i-j
for2:
MOV( [EDI], EAX );// EAX = tomb[k]
CDQ;
IDIV( EBX ); // EAX = tomb[k]/15+i-j
ADD( EAX, ESI ); // ESI = ESI+tomb[k]/15+i-j
ADD(4, EDI);
DEC(ECX); // ECX = ECX-1
JNZ for2; // if ECX=0,
MOV( ESI, EAX ); // EAX = sum
POP( ESI );
POP( EDI );
POP( EDX );
POP( ECX );
POP( EBX );
end program;
编辑:
我看不到 N
和 tomb
。从 i
和 j
我尽我所能 -->
1. test case (i=7830, j=348): result(for me):-15984526, correct:-1700110054
2. test case (i=7830, j=913): result(for me):-669363, correct:-231479087
3. test case (i=7830, j=3475): result(for me):4404210, correct:963858517
4. test case (i=7830, j=-6588): result(for me):-674954, correct:1719334650
5. test case (i=7830, j=29684): result(for me):-6505388, correct:-1490170292
// for (k=0; k<N; k++) sum=sum+tomb[k]/15+i-j;
鉴于此表达式,计算 15+i-j
并使用 IDIV( EBX ); // EAX = tomb[k]/15+i-j
将其用作除数是错误的
!
代数的一般规则规定您需要除以 15
,然后加上 i
并减去 j
。