www.mikrocontroller.net

Forum: Compiler & IDEs inline assembler unter C - auslesen der register


Autor: Matthias Posch (madsonic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen an alle hier im Forum

Bin noch relativ neu und Unerfahren in der Mikrocontroller
programmierung und komme seit ein paar tagen bei einem (eher trivialen?
) problem nicht weiter. Ich will eine routine in C schreiben, die den
Inhalt der Register (auf einem Amtel Atmega16) via USART ausgibt. Es
handelt sich um eine Übung für die Uni, d.h ich muss es selber
schreiben und kann keine fertigen Lösungen verwenden. Die register
werden doch am Anfang des Srams eingeblendet und deshalb könnte ich sie
doch relativ leicht in einer schleife auslesen oder? (inline assembler).
Aber gerade dieser Teil bereitet mir kopfzerbrechen, des Rest hätte ich
schon...könnte vielleich jemand ein kurzes inline-asm code snipplet
posten welches einfach den inhalt aller register in ein unsigned char[]
kopiert? Wäre sehr hilfreich, i kapier die inline assembler direktive
nämlich überhaupt nicht..

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum inline asm?  Eben da sie ja am Anfang des RAM-Bereiches
eingeblendet werden, musst du doch nur die Adressen 0 bis 31
auslesen.  Das geht auch in C.

Dass die Übung keinen nennenswerten praktischen Nährwert hat,
versteht sich von selbst.  Der Inhalt von einigen der so
ausgelesenen Register hängt ja vom Programmcode selbst ab.

Autor: Matthias Posch (madsonic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm ja ich weiss dass es auch nur in C egehn würde, aber dadurch würde
ich ja die Register verändern oder, bzw in assembler habe ich eher die
möglichkeit richtige Registerwerte zu erhalten oder?

Und ja stimmt, praktischen Nutzen hat das ganze nicht.. bringt aber
punkte :-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein wirklich nennenswerter Unterschied zwischen C und
Assembler hier.

Autor: Matthias Posch (madsonic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha ok, dann mach ich es in C. Danke für die Hilfe!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den Einfluss der Ausgaberoutine auf das Resultat
minimieren willst, kannst du die Register ja zuvor
kopieren:
uint8_t save_area[32];

...
  memcpy(save_area, (void *)0, 32);

Dann gibst du den Inhalt von save_area aus.

Autor: Matthias Posch (madsonic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genau das wollte ich mit einer Inline Assembler routine realisieren,
da ich ja nicht weiss welche register memcpy verändert. Also eingentlich
eine ganz einfache sache, eine assembler routine die einen
Speicherbereich kopiert, aber da ist´s halt bei mir gescheitert
bisher...:-)

matthias

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum glaubst du denn, dein inline asm würde weniger Register
zerstören als memcpy()?  Davon abgesehen, kannst du dir ja im
generierten Assemblercode oder im Disassembler angucken, was
passiert.

Der inline asm ist wirklich alles andere als ein Einstiegsprojekt,
vor allem beim GCC.  Er ist unwahrscheinlich mächtig, aber auch
unwahrscheinlich kryptisch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.