rendered paste bodyUnit unit_1;
ReadOnly
neptun:string;@external;
neptun:string:="csjfv1";
procedure Fgv11(VAL i:int32; VAL j:int16);
@use EAX;@returns("EAX");@external;
procedure Fgv12(VAL a:int32; VAL b:uns16; VAR tomb:int32; VAL N:uns32);
@use EAX ;@returns("EAX");@external;
procedure Fgv11(VAL i:int32; VAL j:int16);
@nodisplay;
VAR r:int32;
begin Fgv11; // HASZNN�LHATT� REGISZTEREK: EAX, EBX, ECX, EDX, ESI, EDI,
// NEM HASZNN�LHATT�  �LTALL�NOS REGISZTEREK: EBP, ESP
// s : r= (j*j*2) * (i -j - 3) - 7*j;
// c : return j*j*i - (i+15*r) * (108 - j);
push(EBX); push(ECX); push(EDX); push(ESI);
MOVSX(j,EBX); // Tipus konverzii� segg�tss�gg�vel bett�ltt�ttt�k a j
MOV(i,ECX); // ECX=i
MOV(EBX,EDX); INTMUL(EDX,EDX); // EDX=j*j
MOV(ECX,EAX); SUB(EBX,EAX); SUB(3,EAX); // EAX=i-j-3
//INTMUL(2,EDX,ESI);
//MOV(EDX,ESI);ADD(ESI,ESI); // ESI=2*j*j
LEA([EDX*2],ESI);
INTMUL(ESI,EAX); // EAX=(j*j*2)*(i-j-3)
//MOV(EBX,ESI);ADD(ESI,ESI);ADD(ESI,ESI);ADD(ESI,ESI);SUB(EBX,ESI);
LEA([EBX*8],ESI);SUB(EBX,ESI);
SUB(ESI,EAX); // EAX=r
INTMUL(ECX,EDX); // EDX=j*j*i
INTMUL(15,EAX); ADD(EAX,ECX); // ECX=i+15*r
MOV(108,EAX);SUB(EBX,EAX); // EAX=108-j
INTMUL(ECX,EAX); SUB(EDX,EAX); // EAX= - EREDMM�NY
NEG(EAX); // KK�szen vagyunk
pop(ESI); pop(EDX); pop(ECX); pop(EBX);
end Fgv11;
procedure Fgv12(VAL a:int32; VAL b:uns16; VAR tomb:int32; VAL N:uns32);
@nodisplay;
begin Fgv12;
// j r0=N*b<=a%12345?b-5*a:a+b/N r1=(N+a*3-b)%(N+|max(a,b)|)
// f ri=(ri1-ri2)*(a/(|a+b|+3)) R=Summa{ri-ri%N;i=0..N-1}
push(ebx);push(edi);push(edx);push(ecx);
mov(tomb,edi);
movzx(b,EBX);
intmul(N,EBX); // EBX=N*b
mov(a,EAX);
CDQ; // EDX:EAX=a
mov(12345,ecx);
idiv(ecx); // EDX=a%12345
//if(ebx<=edx) then
//if(ebx<=(type int32 edx)) then
cmp(ebx,edx);
jg kihagy;
movzx(b,eax);
intmul(5,a,ebx);
sub(ebx,eax); // EAX=b-5*a
//else
jmp tovabb;
kihagy:
movzx(b,eax);
cdq;
idiv(N);
add(a,eax); // EAX=a+b/N
//endif;
tovabb: mov(eax,[EDI]);
//*
// j r0=N*b<=a%12345?b-5*a:a+b/N r1=(N+a*3-b)%(N+|max(a,b)|)
mov(a,eax); mov(N,ebx); lea([eax+eax*2],eax); add(ebx,eax);
movzx(b,ecx); sub(ecx,eax); // eax=(N+a*3-b)
mov(a,edx);if((type int32 edx) > ecx) then mov(edx,ecx); endif; // ECX=max(a,b)
if((type int32 ecx) < 0 ) then neg(ecx); endif; //ECX=|max(a,b)
add(ebx,ecx); //ECX=N+|max(a,
cdq; idiv(ecx); add(4,edi); mov(edx,[edi]);
// f ri=(ri1-ri2)*(a/(|a+b|+3)) R=Summa{ri-ri%N;i=0..N-1}
push(esi);
//*
mov(edx,ebx);
mov(a,eax);movzx(b,esi);add(eax,esi);if(@s)then neg(esi); endif; add(3,
cdq; idiv(esi); mov(eax,esi);
//mov([edi-4],eax);
//sub(4,edi);
//for(mov(2,ecx);ecx<N;inc(ecx))do
mov(2,ecx);
eleje:
cmp(ecx,N);
jae vege;
eleje2:
add(4,edi);
sub([edi-2*4],ebx);
//sub(ebx,eax);neg(eax);xchg(eax,ebx);
//mov(a,eax);movzx(b,esi);add(eax,esi);if(@s)then neg(esi); endif; add(
//cdq; //add(a,edx);
//idiv(esi); intmul(eax,ebx);
intmul(esi,ebx);
mov(ebx,[edi]);
inc(ecx);
cmp(ecx,N); jb eleje2;
//jmp eleje;
vege:
//endfor;
/// f ri=(ri1-ri2)*(a/(|a+b|+3)) R=Summa{ri-ri%N;i=0..N-1}
sub(esi,esi); mov(tomb,edi);
for(sub(ecx,ecx);ecx<N;inc(ecx)) do
mov([edi+ecx*4], ebx);
if(ebx>0) then
mov(ebx,eax); cdq; idiv(N); sub(edx,ebx);
endif;
add(ebx,esi);
endfor;
mov(esi,eax);
//*/
pop(esi);
pop(ecx);pop(edx);pop(edi); pop(ebx);
end Fgv12;
end unit_1;