[Inline Assembler] Wo liegt der Fehler?

04/11/2010 11:37 HardCore.1337#1
Hi, ich arbeite seit gestern mit Assembler (inline Assembler). Grundsachen wie Rechnen und einfache Schleifen kann ich schon, aber an diesem nicht sinnvollen Beispiel (das ich nur zum üben nehme :D) bekomme ich einen Zugriffsfehler. Warum?

Code:
function Test(x: integer): Integer; assembler;
  asm
  PUSH EAX;
  MOV EAX, X; //Kopiere einen beliebigen Wert in EAX
  MOV EDX, 30; //kopiere 30 in EDX
  CMP EAX, 20; //WENN EAX = 20 DANN
  JE @Start;   //Springe zu Start
  CDQ;         //EAX auf 64Bit erweitern
  @Start:      //Startausführung starten
    ADD EAX, EDX;  //Addiere EAX mit EDX
    IDIV EAX, EDX; //Diviediere EAX mit EDX
    RET;           //Gebe das Ergebnis zurück
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage (IntToStr(Test(20)));
end;

end.
04/11/2010 14:45 Bot_interesierter#2
Die Genau Fehlermeldung wäre interessant, allerdings vermute ich das es an dem PUSH EAX am Anfang liegt, du müsstest das vor dem Return wieder vom Stack Popen denn sonst returnst du ins nirvana.

Wenn du bei Delphi Funktionen das Assembler lable in weg lässt werden die Parameter übrigens automatisch nacheinander in die Register geschoben, also das MOV EAX, X; würde entfallen bei deiner Funktion :)
04/11/2010 14:56 HardCore.1337#3
Jop, daran lags.
Ich hätte erst POP EAX nutzten sollen.

Nun kommt keine Fehlermeldung mehr, aber das Ergebnis sieht merkwürdig aus.
Es kommt immer -51 raus.

Also theoretisch wird doch so gerechnet

Code:
ADD EAX, EDX;
IDIV EAX, EDX;
...
Code:
20 + 30 (=50)
20/50
...
Oder seh ich das Falsch?
04/11/2010 16:08 Bot_interesierter#4
Machst du vor dem return pop eax?
04/11/2010 16:12 HardCore.1337#5
ja
04/11/2010 16:21 Bot_interesierter#6
Das ist des Pudels Kern!
EAX wird verwendet um den Rückgabewert zu übergeben, also wird schlicht der Wert zurückgegeben, welcher am Anfang auf den Stack gepusht wurde :P
04/11/2010 16:23 HardCore.1337#7
soll ich mal PUSH und POP weg machen?
04/11/2010 16:52 Bot_interesierter#8
Lernst du was wenn ich dir schritt für schritt erkläre was du machen sollst damit das Programm das tut was du wolltest?
Ich glaube nicht und es ist wohl sehr Offensichtlich dass das Push EAX und Pop EAX überflüssig ist, aber wenn du lustig bist kannst du auch einfach ein anderes freies Register benutzten um den wert vom Stack zu holen, Sinnvoll ist das aber nicht.
04/11/2010 18:12 HardCore.1337#9
Ja, ich habe in einem Tutorial gelesen, das es sicherer ist EAX zu Pushen.
Ich arbeite noch nicht sehr lange mit Assembler und deswegen seh ich da auch noch nicht richtig durch.Aber ich hab mir jetzt ein Super Buch geholt.