2016-12-04 21 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; 

EDIT:

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

関連する問題