Fragen zu Register-Variablen

Started by Norbert Spoerl, September 20, 2013, 09:13:30 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Norbert Spoerl

Hallo deutschsprachige Mitglieder,


ich bitte um Hilfe bezüglich des Verstehens von Register-Variablen.

Mit den folgenden Sätzen aus der Hilfe (PBWin 10) komme ich nicht zurecht.

Register variables are preserved when a call to an external DLL or API function is made.

Übersetzung: "Register-Variablen werden beibehalten, wenn ein Anruf an eine externe DLL oder API-Funktion erfolgte."

Extended-precision float variables will be automatically assigned only in Functions that contain no external Function calls.

Übersetzung: "Extended-precision float variablen werden automatisch nur in Funktionen zugewiesen, die keine externen Funktionsaufrufe enthalten."

Aber was bedeutet das im Detail?


Gruß

Norbert

Theo Gottwald

#1
Das ist so eine Spezialfrage, die am besten Hutch beantworten kann.
Grundsätzlich ist es so, dass die zwei Registervariablen ESI und EDI von PB gesichert werden beim Aufruf einer externen Funktion.
Die Ext.-Registervariablen werden innerhalb der CPU wie ein rotierender Stapel verwaltet, da ist das wohl nicht immer so einfach.
Also ich nehme die Extended Registervariablen nicht generell, während ich die zwei "Normalen" Registervariablen immer benutze, außer in ASM Unterprogrammen.

QuoteYou must use care with Inline Assembler floating-point opcodes in functions that enable Register variables.  Floating-point Register variables may occupy up to four of the FPU registers, so you must limit your use of the x87 registers to the remaining four.  Further, floating-point Register variables may never be referenced by name from Inline Assembler code, as the compiler cannot always track the register locations with absolute certainty.


Norbert Spoerl

Hi Theo, erst mal vielen Dank für Deine Antwort.

Ich muß meine Frage genauer stellen.

Was habe ich zu beachten, wenn ich innerhalb einer SUB die Register-Variablen und externe Funktionsaufrufe verwenden will.

1.
Register variables are preserved when a call to an external DLL or API function is made.
- Lassen sich die Register-Variablen in dem Fall gar nicht benutzen?
- Können die Register-Variablen nur als Übergabeparameter für externe Funktionsaufrufe nicht benutzt werden?

2.
Extended-precision float variables will be automatically assigned only in Functions that contain no external Function calls.- Bedeutet das, daß das automatische Setzen der Register-Variablen in dem Fall nicht geht, aber mit der Hand doch? Also dann mit #REGISTER NONE und anschließend REGISRER XYZ AS LONG

Hast Du noch Gedanken dazu?



Theo Gottwald

Also ich sehe das so:

1. Register Variablen kannst du immer nehmen es sei denn du verwendest Assembler-Unterprogramme (und dann die Register ESI und EDI). Die Übergabe von Parametern an DLL's ist standardisiert und erfolgt glaub ich auf dem Stack (bei x32). Das hat mit Register-Variablen nichts zu tun. Im worst case bekommst du da eine FM "Invalid Register Variable" oder so.
Da kannst du nix falsch machen ohne dass du eine FM bekommst.

2. Zu den Ext.-FP Registern kann ich nichts sagen, da ich die kaum je benötige. Wenn du die brauchst frag mal im ASM Subforum, im PB-Forum. Hutch weiß es bestimmt genauer.