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..
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.
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 :-)
Kein wirklich nennenswerter Unterschied zwischen C und Assembler hier.
Aha ok, dann mach ich es in C. Danke für die Hilfe!
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.