Forum: PC-Programmierung Inline Assambler Verständnisproblem(Variablen /Register)


von Christian V. (michse)


Lesenswert?

Woher weis ich eigentlich wenn ich mitten in einem C Programm 
Inlineassambler verwende, welche Variable in Welchem Register liegt?

von Stephan B. (matrixstorm)


Lesenswert?

Fuer welche Architektur? AVR?

von Wilhelm F. (Gast)


Lesenswert?

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.

von Karl (Gast)


Lesenswert?

Stephan B. schrieb:
> Fuer welche Architektur? AVR?
Da der Beitrag im Forum: PC-Programmierung ist, vermutlich ein PC.

von Stephan B. (matrixstorm)


Lesenswert?

Wollte noch was nachtragen - war zu spaet.

Prinzipiell ist ja Platform egal...

MfG

von Max H. (hartl192)


Lesenswert?

Auf den Compiler kommt’s an...

von Rainer V. (rudi994)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.