Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: ASM-Funktion Verständnisfrage und anpassen

  Alt 25. Nov 2019, 16:21
Danach wird genrand_MT19937 aufgerufen. Aber woher weiß die Funktion, was Range ist?
Das muss sie gar nicht. genrand_MT19937 liefert einen zufälligen Longint zurück, der in Folge mit Range multipliziert wird. Da diese Multiplikation in 32-Bit durchgeführt wird, entspricht das einem impliziten modulo 2^32. Man kann nachweisen, daß das Ergebnis kleiner als die beiden Multiplikanden ist (kann den Nachweis nur gerade nicht finden).

Der ASM-Code liest sich in etwa so:
Delphi-Quellcode:
 PUSH EAX { Parameter 1 = Range auf Stack sichern }
 CALL genrand_MT19937 { Random Longint aufrufen, Ergebnis steht in EAX (keine Parameter)}
 POP EDX { Range vom Stack in EDX holen }
 MUL EDX { EAX mit EDX multiplizieren }
 MOV EAX,EDX { Ergebnis in result = EDX zurückgeben }
Wenn du einen Range-Min/Max willst, würde ich einen Wrapper um diese Funktion machen:
Delphi-Quellcode:
function RandInt_Range(AMin, AMax: Longint): Longint;
begin
  Result := randInt_MT19937(AMax - AMin) + AMin;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat