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


von Matthias P. (madsonic)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Matthias P. (madsonic)


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 :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kein wirklich nennenswerter Unterschied zwischen C und
Assembler hier.

von Matthias P. (madsonic)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du den Einfluss der Ausgaberoutine auf das Resultat
minimieren willst, kannst du die Register ja zuvor
kopieren:
1
uint8_t save_area[32];
2
3
...
4
  memcpy(save_area, (void *)0, 32);

Dann gibst du den Inhalt von save_area aus.

von Matthias P. (madsonic)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.