mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Optimierungsbedarf AT91SAM7S256 HEX-Ausgabe


Autor: Peter Pippinger (axis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

ich habe mir eine kleine Funktion geschrieben, die mir einen 
Registerinhalt als Hexzahl ausgibt (funktioniert auch). Nachdem ich so 
wenig wie möglich Register dafür verwenden möchte, hier meine Frage, ob 
jemand sieht, was man besser machen könnte. Achso: Einen Stack möchte 
ich auch nicht verwenden.

Der Wert wird hierbei in r7 übergeben. So wird dann z.B. aus r7(255) in 
der Ausgabe "000000FF". An 0x202000 + 10 liegt mein 
"0123456789ABCDEF"-String, aus dem ich die einzelnen Stellen der Hexzahl 
herauslese. Dazu extrahiere ich jeweils immer die oberen 4 Bit des 
Registers und addiere den Wert als Zeiger auf die betreffende Stelle in 
meinem String.

Vielen Dank für jeden Tip!

Hier der Quelltext:

write_hex:
    // -----------------------------------------------------------
    // Basisadresse setzen
    LDR r0, =USART_BASE
    // Ausgabe besteht aus 8 Stellen
    LDR r6, =8

    // warten, nis nächstes Zeichen übertragen werden kann
next_write_hex:
    LDR r1, [r0, #USART_US_CSR]
    AND r1, r1, #BIT1
    CMP r1, #BIT1
    BNE next_write_hex

    LDR r5, =0
    // Zeiger auf Stringanfang ("01234567890ABCDEF)
    LDR r8, =0x202000 + 10
    // die oberen 4 Bit extrahieren
    AND r5, r7, #11110000000000000000000000000000b
    MOV r5, r5, LSR #28
    // den Wert der 4 Bit zum Zeiger addieren
    ADD r8, r8, r5

    // betreffendes Zeichen aus dem String holen
    LDRB R4,[R8]

    // Und an der seriellen Schnittstelle ausgeben
    ADD r4, r4 , #0x100
    STR r4, [r0, #USART_US_THR]

end_hex:
    // weiter mit den nächsten 4 Bit
    MOV r7, r7, LSL #4

    // die restlichen Stellen durchgehen
    SUB r6, r6, #1
    CMP r6, #0
    BNE next_write_hex

    // -----------------------------------------------------------
    // Zurueck aus Subroutine
    MOV pc, r14

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich bin zwar nicht so fit im Asm für die Arms aber vielleicht geht das 
ja:

// den Wert der 4 Bit zum Zeiger addieren
    ADD r8, r8, r5
// betreffendes Zeichen aus dem String holen
    LDRB R4,[R8]

würde ich zu folgendes machen:

// betreffendes Zeichen aus dem String holen
// String StartAdresse + Offset von R5
    LDRB R4,[R8+R5]

sollte folgendes heißen: R4=Inhalt von Speicher[R8+R5]

weiter:

// die restlichen Stellen durchgehen
    SUB r6, r6, #1
    CMP r6, #0
    BNE next_write_hex

wird ich zu folgendes machen:

// die restlichen Stellen durchgehen
// R6=R6-1
// if (R6!=0)
//     goto next_write_hex;
//
    SUBS r6, r6, #1
    BNE next_write_hex

Wenn es nicht stimmt ;-)
hab ich nichts gesagt....

Stephan

PS: GBA Assembler-Seite, da steht sowas auch drin.

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.