Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: just-in-time - Codeerzeugung : Funktionen aus Formeln?

  Alt 23. Okt 2009, 01:13
hier 'ne kleine Spielerei

das läßt sich bestimmt noch extremst ausbauen und erweitern.

cool wäre auch, wenn die hinzugefügten Codes/Befehle erstmal in einer Tabelle/Liste gespeichert werden, so das man sie noch editieren kann und erst im Execute daraus der eigentliche ASM-Code zusammengesetzt wird.


Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
  Var Code: TASM;
    i, i2: Integer;

  Begin
    i := StrToInt(Edit1.Text);
    i2 := StrToInt(Edit2.Text);
    Edit3.Text := 'calc';

    Code := TASM.Create;
    Try
      Code.Write(cPUSH, rECX);
      Code.Write(cMOV, rECX, 100);
      Code.Write(cIMUL, rEDX);
      Code.Write(cADD, rEAX, rECX);
      Code.Write(cPOP, rECX);
      Code.Write(cRET);
      Code.SetConvention(ccRegister);
      Code.AddPram(i);
      Code.AddPram(i2);
      i := Code.Execute;
      // i := Code.Result;
    Finally
      Code.Free;
    End;
    Edit3.Text := IntToStr(i);
  End;
man wird es nicht glauben, aber dieser hochkomplizierte Code kann höchst wissenschaftliche Berechnungen durchführen
i := i * i2 + 100; nicht wundern, da ist auch aktuell fast nichts und vieles teils hardkodiert drinnen, welches man genau für das Beispiel braucht
(das PUSH und POP ist natürlich nicht unbedingt nötig, aber so ist der Code etwas länger )


[add]
diese
Delphi-Quellcode:
For i := 7 downto 0 do Write(cNOP);
Write(cMOV, rEAX, nil);
Write(cJMP, rEAX);
ist jetzt einfach nur 'nen billiger Schutzblock, falls z.B. jemand das RET am Ende vergißt.
Angehängte Dateien
Dateityp: 7z asm_111.7z (155,6 KB, 12x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat