最近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:
N
とtomb
私にとっては見えません。 i
とj
私ができるすべてから - この式を考える>
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
1)HLAは使用しないでください。今までのように。 2)デバッガを使用する方法を学ぶ3)少なくとも予想される出力と実際の出力を提供する。 – Jester
@Celvin答えを編集する(左下隅の "編集"ボタン)、コードをコメントとして投稿しないでください。 –
また、問題の定義が "間違った結果を返すのはなぜですか?"結果はどのようなものになると思いますか?このコードは何を返しますか?なぜあなたはそれが間違っていると信じていますか?次に、@ Jesterの投稿を参照し、デバッガを使ってコンパイルされたバイナリをステップ実行します。 –