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;
编辑:
的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的文章,并使用调试器遍历编译后的二进制文件。 –