2016-12-04 52 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

相關問題