Inline Assambler Verständnisproblem(Variablen /Register)

Gast #3580251
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.
#3580291
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.
Persönliche Seite #3581667
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren