Hallo zusammen, Ich habe einen Routine gesucht um eine hex Zahl in einen ASCII Wert umzuwandeln. Von diesem Code schwirrt ja hier genug rum. Ich habe mich für eine Routine entschieden die wohl schon mal mit Erfolg getestet worden ist (auf nem AVR). AVR Code: ;input: R16= 0...255 ;output: R18,R17,R16 (ASCII) ldi r18,-1 + '0' _bcdi: inc R18 subi R16,100 brcc _bcd1 ldi R17,10 + '0' _bcd2: dec R17 subi R16,-10 brcs _bcd2 subi R16, -'0' ret Meine C51 Interpretation (die nicht funktioniert) mov RR8,#47 _bcdi: inc RR8 mov a,RR6 subb a,#100 mov RR6,a jnc _bcdi mov RR7,#58 _bcd2: dec RR7 mov a,RR6 subb a,#-10 mov RR6,a jc _bcd2 mov a,RR6 subb a,#-48 mov RR6,a ret Hat jemand ne Ahnung wo da der Wurm drin ist ? Die RR6 Stelle scheint zu funktionieren, der Rest ist nur Müll. Habe irgendwie die befürchtung das der mit der subtraktion mit den negativen Zahlen nicht klar kommt... Gruß Alex
subb = subtract with borrow. Das Carry-Flag wird mit abgezogen. Ein "clr c" vor jedem "subb" sollte helfen.
habs gerade ausprobiert, hat leider nicht geholfen... nur die R16 Stelle wird richtig dargestellt.
Argh - ich habe mir den Code nicht genauer angeschaut. Der Code ist -schlichtweg- großer Mist. Was macht das Programm: Angenommen, R16 hat als Inhalt 54. ldi r18,-1 + '0' R18 = 47 _bcdi: inc R18 R18 = 48 subi R16,100 R16 = -46 PENG. brcc _bcd1 ldi R17,10 + '0' _bcd2: dec R17 subi R16,-10 brcs _bcd2 subi R16, -'0' ret Dieser Code funzt nur bei Zahlen >= 110. Vor der Subtraktion müßte eigentlich noch geprüft werden, ob die Zahl auch >= 100 ist. Der MCS-51 kann doch dividieren, damit gehts bequemer. Ich muß mal kramen, irgendwo sollte ich noch einen MCS-51 Codeschnipsel für so etwas haben.
Der Code ist schon richtig und funktioniert von 0..255. Anbei mal auf Addition umgestellt, da spart man sich das C-Flag löschen. Und das ständige MOVen von und zum ACC ist auch nicht nötig, ACC wird doch nicht anderweitig geändert. Ich habs simuliert, läuft wie gewünscht. Vielleicht benutzt Du einen Assembler, der sich nicht an die Intel-Syntax hält und dann daraus Mist macht. Mit dem Keil oder Metalink gehts jedenfalls. Wie schon gesagt wurde, 8Bit Werte kann der 8051 aber auch direkt dividieren (mit Rest). @thkaiser "Der Code ist -schlichtweg- großer Mist." Dann schau ihn Dir mal genauer an, auch das AVR-Beispiel geht, ist ja schließlich von mir :-) Peter
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.