ProcedureReturn ohne Wert gibt EAX zurück

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

ProcedureReturn ohne Wert gibt EAX zurück

Beitrag von Thorium »

Nicht wirklich ein Bug aber vieleicht interessant zu wissen für den ein oder anderen, ist mir grad eben bei meinem aktuellen Projekt aufgefallen.

Verlässt man eine Prozedur mit ProcedureReturn ohne einen Wert anzugeben wird das EAX Register nicht genullt, also praktisch übergeben. Egal ob die Prozedur für Rückgaben deklariert wurde oder nicht. Bei erreichen von EndProcedure wird das EAX Register genullt, auch hier egal ob die Prozedur für Rückgaben deklariert wurde oder nicht.

Hat mir grad ein bischen Code gespart. :allright:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich habe noch den ungefähren Wortlaut von freak (glaube ich) im Ohr, wonach es so gewollt/normal ist, dass ProcedureReturn ohne Wert automatisch das zurückgibt, was noch im EAX Register steckt.
Ich meine, er hätte das so gesagt.

Demnach ist das wirklich kein Bug, ich hätte diesen Thread daher lieber in Allgemein erstellt.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

AND51 hat geschrieben: Demnach ist das wirklich kein Bug, ich hätte diesen Thread daher lieber in Allgemein erstellt.
Naja es ist ein unerwartetes Verhalten, steht ja auch nicht in der Hilfe. Von daher dachte ich es passt hier rein.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag von Ligatur »

Es ist kein unerwartetes Verhalten und steht auch so in der Hilfe:
PB Hilfe hat geschrieben: - Um den Inhalt des 'eax' Registers direkt zurückzugeben, benutzen Sie einfach ProcedureReturn ohne einen weiteren Ausdruck. Dies lässt den Inhalt des 'eax' Registers unangetastet und benutzt ihn als Rückgabewert.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Ligatur hat geschrieben:Es ist kein unerwartetes Verhalten und steht auch so in der Hilfe:
PB Hilfe hat geschrieben: - Um den Inhalt des 'eax' Registers direkt zurückzugeben, benutzen Sie einfach ProcedureReturn ohne einen weiteren Ausdruck. Dies lässt den Inhalt des 'eax' Registers unangetastet und benutzt ihn als Rückgabewert.
Wenn man es nicht weis ist es definitiv ein unerwartetes Verhalten!

Wo steht das eigentlich in der Hilfe? Bei mir kann ich das im Eintrag zu Procedure/EndProcedure/ProcedureReturn nicht finden (PB 4.10).
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Hey Thorium!
Du bist doch hier im Board (einer) der ASM-Experte(n), oder?
Kannst du mir da vielleicht mal nen paar Tricks zeigen?
Ich wollte zwar schon mal einsteigen, aber weiter als nen paar Register zu befüllen und inkrementieren bin ich nicht gekommen.
Lohnt es sich überhaupt, sich ASM anzueignen, vor allem in PB? Kann man damit gute Sachen machen? Oder lohnt sich das nicht?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag von Ligatur »

Thorium hat geschrieben: Wenn man es nicht weis ist es definitiv ein unerwartetes Verhalten!

Wo steht das eigentlich in der Hilfe? Bei mir kann ich das im Eintrag zu Procedure/EndProcedure/ProcedureReturn nicht finden (PB 4.10).
Unter Referenzhandbuch -> Verschiedene Themen -> Inline x86 ASM
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

AND51 hat geschrieben:Hey Thorium!
Du bist doch hier im Board (einer) der ASM-Experte(n), oder?
Kannst du mir da vielleicht mal nen paar Tricks zeigen?
Ich wollte zwar schon mal einsteigen, aber weiter als nen paar Register zu befüllen und inkrementieren bin ich nicht gekommen.
Lohnt es sich überhaupt, sich ASM anzueignen, vor allem in PB? Kann man damit gute Sachen machen? Oder lohnt sich das nicht?
Experte bin ich garantiert nicht. :)
Ich kann nur ein paar Basics.

Obs sich lohnt kommt halt immer drauf an was man machen will. Allgemein lässt sich Assembler ziemlich gut in PB anwenden. Man kann es zur Optimierung von zeitkritischen Prozeduren verwenden. Obwohl meine ASM-Prozeduren bis jetzt immer langsamer waren als wenn ichs in reinem PB geschrieben hätte. *g* Also Optimierung ist nicht simpel, da reichen ein paar Basics nicht aus. Gibt interessante Artikel zu dem Thema aber da muss man schon recht Tief einsteigen in ASM und die Funktionsweise der CPU.

Ich nutze es im Augenblick eigentlich rein für Codemodifikationen zur Laufzeit in PB. Also ich schreibe eigene ASM-Anweisungen über bestehende Anweisungen um zu bewirken das Fremdprogramme das machen was ich will. :mrgreen: Das funktioniert auch ganz gut mit PB, dank der OnError-Library die mit nem Disassembler daherkommt. :allright:
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ahso.
Und mit Basics meinst du was? Auch so'n bisschen Register-hin und herschieben, oder was genau?
Klingt schon interessant, was du da erzählst. Na, dann werde ich wohl mit ASM noch ein bisschen warten.
Bin trotzdem stolz darauf, dass ich Variablen in- und dekrementeiren kann. :D

Eine Frage: Es gibt ja diese Register EAX, EBX, ECX usw. ich glaub das ging bis EDX?
jedenfalls empfiehlt PureBasic nur 3 Register zu benutzen, EAX, EBX und noch eines. EIne Veränderung der anderen Register könnten Fehler hervorrufen. Irgendwie so habe ich das in Erinnerung.
Meine Frage: Wenn ich jetzt zum Beispiel eine Zahl zwischenspeichern will, kann man diese vorübergehend in eines dieser Register speichern, evtl. damit rumrechnen und später wieder abrufen? Also im Hinblick darauf, dass es schneller geht, als über PB-Variablen und dass das vielleicht Speicher spart (da man sich eine extra Variable spart)?
Gibt es noch andere Handkniffe, mit denen man kleine, aber feine Optimierungen herbeiführen kann?


Wenn du aber jetzt sagst: Könnte man, lohnt sich aber nicht, dann warte ich mit ASM wirklich, bis ich es später mal brauchen sollte. :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

AND51 hat geschrieben:Ahso.
Und mit Basics meinst du was? Auch so'n bisschen Register-hin und herschieben, oder was genau?
Klingt schon interessant, was du da erzählst. Na, dann werde ich wohl mit ASM noch ein bisschen warten.
Bin trotzdem stolz darauf, dass ich Variablen in- und dekrementeiren kann. :D
Jo, Register hin- und herschieben, Speicher hin- und herschieben, mit dem Stack arbeiten, mathematische Rechnungen mit Ganzzahlen. Mehr kann ich im Prinzip net. Reicht für meine Zwecke erstmal aus. Hab auch schon ein bischen mit den String und Repetier Anweisungen gearbeitet.
AND51 hat geschrieben: Eine Frage: Es gibt ja diese Register EAX, EBX, ECX usw. ich glaub das ging bis EDX?
Es gibt noch einige mehr, die alphabetische Reihenfolge hat damit aber wenig zu tun. Andere Register sind z.B. ESI und EDI.
AND51 hat geschrieben: jedenfalls empfiehlt PureBasic nur 3 Register zu benutzen, EAX, EBX und noch eines. EIne Veränderung der anderen Register könnten Fehler hervorrufen. Irgendwie so habe ich das in Erinnerung.
Meine Frage: Wenn ich jetzt zum Beispiel eine Zahl zwischenspeichern will, kann man diese vorübergehend in eines dieser Register speichern, evtl. damit rumrechnen und später wieder abrufen? Also im Hinblick darauf, dass es schneller geht, als über PB-Variablen und dass das vielleicht Speicher spart (da man sich eine extra Variable spart)?
Ja das geht.
Du kannst ein Register sichern und später wiederherstellen.
Du schiebst den Registerinhalt einfach auf den Stack, benutzt das Register dann für deine Zwecke und danach hohlst du den ursprünglichen Wert des Registers wieder vom Stack runter ins Register.

Code: Alles auswählen

!push esi     ;Registerinhalt auf den Stack schieben
;dein Code
;dein Code
;dein Code
;!pop esi     ;Registerinhalt wieder vom Stack runterholen
AND51 hat geschrieben: Gibt es noch andere Handkniffe, mit denen man kleine, aber feine Optimierungen herbeiführen kann?
Wie gesagt da bin ich der falsche. Kann ich dir leider nicht beantworten.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten