Inline Assambler Verständnisproblem(Variablen /Register)

Gast
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.
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.