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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.