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.