Einzelnen Beitrag anzeigen

DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

ASM-Funktion Verständnisfrage und anpassen (asm > Delphicode? bzw asm x86 > x64?)

  Alt 25. Nov 2019, 15:45
Aus einem interessanten aber relativ komplizierten Algorithmus habe ich diese Funktion
Delphi-Quellcode:
function randInt_MT19937(Range: LongInt): LongInt;
asm
 PUSH EAX
 CALL genrand_MT19937
 POP EDX
 MUL EDX
 MOV EAX,EDX
end;
Das ist im Prinzip ein Random().
Der parameter Range wird in EAX geschrieben. Wie würde diese Funktion aber aussehen, wenn als Parameter Min, Max: LongInt dort stände?

https://www.guidogybels.eu/asmch2.html
Hier steht man schreibt den zweiten Parameter in EDX aber der wird schon verwendet.

Danach wird genrand_MT19937 aufgerufen. Aber woher weiß die Funktion, was Range ist?

Delphi-Quellcode:
function genrand_MT19937: LongInt;
const
 mag01: array [0 .. 1] of LongInt = (0, MT19937MATRIX_A);
var
 y: LongInt;
 kk: Integer;
begin
 if mti >= MT19937N{generate MT19937N longints at one time}
 then
  begin
   if mti = (MT19937N + 1) then // if sgenrand_MT19937() has not been called,
    sgenrand_MT19937(4357); // default initial seed is used
   for kk := 0 to MT19937N - MT19937M - 1 do
    begin
     y := (mt[kk] and MT19937UPPER_MASK) or (mt[kk + 1] and MT19937LOWER_MASK);
     mt[kk] := mt[kk + MT19937M] xor (y shr 1) xor mag01[y and $00000001];
    end;
   for kk := MT19937N - MT19937M to MT19937N - 2 do
    begin
     y := (mt[kk] and MT19937UPPER_MASK) or (mt[kk + 1] and MT19937LOWER_MASK);
     mt[kk] := mt[kk + (MT19937M - MT19937N)] xor (y shr 1) xor mag01[y and $00000001];
    end;
   y := (mt[MT19937N - 1] and MT19937UPPER_MASK) or (mt[0] and MT19937LOWER_MASK);
   mt[MT19937N - 1] := mt[MT19937M - 1] xor (y shr 1) xor mag01[y and $00000001];
   mti := 0;
  end;
 y := mt[mti];
 inc(mti);
 y := y xor (y shr 11);
 y := y xor (y shl 7) and TEMPERING_MASK_B;
 y := y xor (y shl 15) and TEMPERING_MASK_C;
 y := y xor (y shr 18);
 Result := y;
end;
Die Unit gibt es hier
http://www.gokiburi.de/MT19937.pas

Geändert von DieDolly (25. Nov 2019 um 18:35 Uhr)
  Mit Zitat antworten Zitat