Assembly 为什么在这个程序中返回错误的结果?

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

我最近开始使用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 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;