Woher weis ich eigentlich wenn ich mitten in einem C Programm Inlineassambler verwende, welche Variable in Welchem Register liegt?
Christian V. schrieb: > Woher weis ich eigentlich wenn ich mitten in einem C Programm > Inlineassambler verwende, welche Variable in Welchem Register liegt? Die Variablen im Inline-Assembler müssen in der Funktonsdeklaration auch bekannt gemacht werden. Aber das ist je nach Compiler verschieden, da muß man die Manuals mal lesen.
Stephan B. schrieb: > Fuer welche Architektur? AVR? Da der Beitrag im Forum: PC-Programmierung ist, vermutlich ein PC.
Wollte noch was nachtragen - war zu spaet. Prinzipiell ist ja Platform egal... MfG
Variablen und andere Daten liegen doch auf Adressen im Code-, Daten- oder Stack-Segment, je nach dem. Wenn sie in Registern platziert wären, dann wären die Register ja zu nichts anderem zu gebrauchen. Zudem gibt es auch Variablen o.a. Daten, die von der Bitanzahl her größer als ein Register sind und mit deren Format (z.B. Fließpunktzahl) ein Register bzw. die ALU nichts anfangen kann. Oder? Ich habe mal eine Inline-Assembler-Routine in Cpp mit CodeBlocks getestet, wo man z.B. eine Liste mit Byte- oder Integerwerten an Register übergeben kann. Die Werte wurden in den Registern z.B. addiert oder multipliziert. Die Ergebnisse wurden als Liste wieder ausgegeben. Dabei kann/muß man Variablen verwenden.
1) Inline-Assembler ist keine Funktion / kein Funktionsaufruf 2) Selbst wenn eine Funktion ein Wert im Register X erhält, gibt der Compiler keine Garantie dafür, daß diese am Inline Assembler immer noch in X liegt. Inleine Assembler funktioniert so: Dem Inline Assembler werden die Variablen übergeben, und man gibt Registerklassen an (per Constraint), die adäquat für die Variablen sind. Der Compiler entscheidet denn, welches Register er zuordnet, und dieses kann man per %-Direktive ähnlich wie bei printf im asm-Template ausgeben lassen. Nur sehr selten wird eine exakte Registerzuordnung wirklich benötogt, in diesem Fall stellt GCC lokale Register-Variablen zur Verfügung: http://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html Also:
1 | void foo (int x) |
2 | {
|
3 | register int rx asm ("r2") = x; |
4 | ...
|
5 | asm ("..." : "+r" (rx)); |
6 | }
|
Hier wird beim Verwenden des asm, das rx verwendet, rx in r2 (und evtl. weiteren, von der Größe von rx abhängigen Registern) abgelegt. Ansonsten kann man aber nicht davon ausgehen, daß rx in r2 liegt, etwa bei einem asm das rx nicht verwendet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.