Forum: Mikrocontroller und Digitale Elektronik Optimierungsbedarf AT91SAM7S256 HEX-Ausgabe


von Peter P. (axis)


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

von Stephan (Gast)


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.

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.