Assembly 为什么在这个程序中返回错误的结果?
我最近开始使用HLA,但在这段代码中找不到错误。请帮帮我。为什么在这个程序中返回错误的结果? 程序已完成,没有任何语法错误,但返回错误值Assembly 为什么在这个程序中返回错误的结果?,assembly,hla,Assembly,Hla,我最近开始使用HLA,但在这段代码中找不到错误。请帮帮我。为什么在这个程序中返回错误的结果? 程序已完成,没有任何语法错误,但返回错误值 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
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;
//对于(k=0;k1)不要使用HLA。就像,永远。2) 学习使用调试器3)至少提供预期和实际的输出。@Celvin编辑您的答案(“编辑”按钮位于左下角),不要将代码作为注释发布。此外,当您的问题定义为“为什么返回错误结果?”时,很难帮到您。您希望结果是什么?这个代码返回什么?你为什么认为这是错误的?然后参考@Jester的帖子,使用调试器逐步完成编译后的二进制文件。
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;