Autor Beitrag
Steve_B
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 02.09.04 18:38 
Hallo!

Kann eine Assembler-Funktion nur ein Byte / Char (al) oder ein Word (ax) zurückliefern oder geht das irgendwie auch mit größeren Zahlen >65536 (zwei Register = 32 Bit)?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
function MachWas: Word;
asm
  mov ax,0FFFFh
end;
(Gut, so ist die Funktion ziemlich sinnlos, es geht mir halt nur um den Rückgabewert...)

Thanks!
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 02.09.04 18:59 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function MachWas : Integer;
asm
  mov eax,0FFFFFFFFh
  mov Result,eax
end;


Gruß,
Jörg

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Do 02.09.04 19:36 
Das zweite mov ist unnötig, da bei der Aufrufkonvention register (die verwendet wird, wenn nix dabei steht) der Rückgabebwert per Definition in EAX liegt.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 03.09.04 18:35 
Nicht ganz. Result wird auf dem Stack abgelegt und erst am Ende der Fkt nach EAX geschrieben.
(Natürlich nur wenn es auch benutzt wird, ansonsten kann man getrost EAX benutzen)
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 03.09.04 21:28 
obbschtkuche hat folgendes geschrieben:
Nicht ganz. Result wird auf dem Stack abgelegt und erst am Ende der Fkt nach EAX geschrieben.
(Natürlich nur wenn es auch benutzt wird, ansonsten kann man getrost EAX benutzen)

So, so.
Hast du dir den Code von oben mal im Debugger angeschaut?
Da steht doch glatt:
ausblenden Delphi-Quelltext
1:
2:
MachWas:  mov eax,0FFFFFFFFh
          mov eax,eax

Na sowas. Hat "mov eax, eax" etwa etwas mit dem Stack zu tun?

Der Compiler lagert Result schon auch auf dem Stack aus, nur eben nicht immer und vor allem nicht in reinen Assembler-Funktionen. Da entspricht Result in 98% aller Fälle EAX. Bei Fließkommazahlen ist das anders und bei Int64 wird noch EDX misbraucht.

_________________
Ist Zeit wirklich Geld?
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Sa 04.09.04 10:31 
Zu diesem Thema auch interessant:
Online-Hilfe -> ObjectPascal-Referenz -> Ablaufsteuerung -> Parameter und Funktionsergebnisse -> Funktionsergebnisse

(zumindest heißts so bei Delphi5).

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 04.09.04 10:56 
pfffff.

AndyB hat folgendes geschrieben:

So, so.
Hast du dir den Code von oben mal im Debugger angeschaut?


Natürlich.

AndyB hat folgendes geschrieben:

Da steht doch glatt:
ausblenden Delphi-Quelltext
1:
2:
MachWas:  mov eax,0FFFFFFFFh
          mov eax,eax

Na sowas. Hat "mov eax, eax" etwa etwas mit dem Stack zu tun?


Na sowas. Hat das etwa wirklich was mit dem Delphi-Debugger zu tun?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function MachWas : Integer;
asm
  mov eax,0FFFFFFFFh
  mov Result,eax
end;


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
push ebp
mov  ebp, esp
push ecx
mov  eax, $ffffffff
mov  [ebp-$04], eax
mov  eax, [ebp-$04]
pop  ecx
pop  ebp
ret


Und jetzt behaupte bloß nicht Result wäre da nicht als lokale Variable im Stack. Hast du vielleicht in den Einstellungen irgendwas geändert dass solche unnützen Sachen rausoptimiert sind?
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Sa 04.09.04 12:17 
Ich schätz mal, ihr redet da über andere Funktionen. Bei der Funktion:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
function MachWas : Integer;  
asm  
  mov eax,0FFFFFFFFh  
  mov Result,eax  
end;

Hier wird Result als lokale Variable auf dem Stack angelegt. Und wie man im erzeugten Code sehen kann, wird der Wert von Result danach wieder in EAX kopiert. Die Zuweisung an Result ist hier also unnötig und führt zu identischem Laufzeitverhalten, nur einigen Anweisungen mehr.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Sa 04.09.04 17:25 
UC-Chewie hat folgendes geschrieben:
Ich schätz mal, ihr redet da über andere Funktionen.

Eigentlich nicht. Aber höchstwahrscheinlich von anderen Delphi Versionen. Ich habe obiges nicht nachgeprüft, da ich das "mov eax,eax" schon mal in einem meiner Programme gefunden habe. Der i386 kann damit anscheinend nichts anfangen und zerstört dabei das eax Register. Deswegen wird Borland das wahrscheinlich ausgebessert haben. Es war igrendwo zwischen Delphi 6 und Delphi 6 Update 2. Damit entschuldige ich mich in aller Förmlichkeit bei obbschtkuche. :oops:

_________________
Ist Zeit wirklich Geld?