All pastes #419159 Raw Edit

gyuri2012

public text v1 · immutable
·published 2007-04-01 03:02 UTC
rendered paste body
Unit 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;