2016-12-04 53 views
1

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

编辑:

Ntomb不适合我可见。从ij我能 - >

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 
+9

1)不要使用HLA。像,永远。 2)学习使用调试器3)至少提供预期的和实际的输出。 – Jester

+0

@Celvin编辑你的答案(左下角的“编辑”按钮),不要作为评论发布代码。 –

+0

另外,当你的问题定义是“为什么要返回错误的结果?”时,帮助你真的很难。你期望结果是什么?这段代码返回什么?你为什么认为这是错的?然后参考@ Jester的文章,并使用调试器遍历编译后的二进制文件。 –

回答

2
// 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

+0

它的工作原理!谢谢! :) – Celvin

相关问题