Mit diesem Assembler-Code kann eine 16-Bit Zahl in eine 5 stellige ASC-Zahl umgewandelt werden. Vorteil: nur 5 Register werden benötigt, da der Stack zur Zwischenspeicherung genutzt wird Gruß Bernhard aus Erfurt
Ich finde es ja auch immer sehr interessant, wie andere solche immer wiederkehrenden "Probleme" bei der Assembler-Programmierung lösen und wenn dann auch noch sparsam (und nicht geizig!) mit den Resourcen umgegangen wird... In diesem Falle möchte ich aber auf eine (zugegebenermaßen weniger leicht verständliche, und das ist gerade für nicht so versierte sehr wichtig) Alternative hinweisen, die auch mit den 5, zur Ergebnisdarstellung nötigen Registern auskommt, aber keinen Stack benötigt und ein ganzes Stück "kompakter" ist als die vorgestellte Routine. Leider entstmmt sie nicht meinem weniger ausgeprägtem Genie sondern von Peter Dannegger (glaube ich zumindest). Ich habe das ganze für meine "Nomenklatur" aufbereitet und verwende für das Zerlegen eines Byte oder eines Word in Dezimalziffern oder gleich in ASCII-Zeichen nichts anderes mehr. Die Geschwindigkeit habe ich bisher noch nicht verglichen, Peters Routine subtrahiert teilweise "von oben" oder "von unten". Damit dürften sich "gleichmäßigere" Laufzeiten in Abhängigkeit vom Eingangswert ergeben (nicht bei 0x0000 "ganz schnell" und bei 0xFFFF "ganz langsam"). Aber, um es nocheinmal klarzustellen, ich hasse Rechthaberdiskussionen (MEIN oder DAS Programm ist das Beste), sondern ich finde es wichtig, dass man den verwendeten Programmcode auch versteht um daraus zu lernen. Deshalb dies nur als Ergänzung/Alternative. Jörg
Hallöchen Jörg, könntest Du uns bitte den Link benennen, in dem Du das andere Vefahren gefunden hast? Danke
Ja, genau da. Ist schon recht clever gelöst, finde ich, oder? Jörg
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; http://www.telesys.ru/wwwboards/mcontrol/297/messages/141922.shtml ; ;Converts unsigned integer value of bin_h:bin_l to ASCII string. ;Only upper registers can be used, bin_h/asc4 and bin_l/asc5 ;variable pairs must share common register each. ;26 words, 183(bin=59999)/32(bin=0) clocks with rcall. ;No registers used ;) ; ;.def asc1 =r16 ;.def asc2 =r17 ;.def asc3 =r18 ; ;.def asc4 =r19 ;.def bin_h =r19 ; ;.def asc5 =r20 ;.def bin_l =r20 ; ;ldi bin_h,high(59999) ;Just for test ;ldi bin_l,low(59999) ; ;ldi bin_h,0x04 ;Just for test ;ldi bin_l,0xE2 ; ; rcall itoa ; ;nop ; ; itoa: ;;;;;;;;;;;;; ldi asc1,'0'-1 ;Will be ASCII '0' after 1st increment sub10k: inc asc1 ;'0','1','2','3','4','5','6' subi bin_l,low(10000) sbci bin_h,high(10000) brsh sub10k subi bin_l,low(-10000) sbci bin_h,high(-10000) ; ldi asc2,'0'-1 sub1k: inc asc2 ;'0','1','2','3','4','5','6','7','8','9' subi bin_l,low(1000) sbci bin_h,high(1000) brsh sub1k subi bin_l,low(-1000) sbci bin_h,high(-1000) ; ldi asc3,'0'-1 sub100: inc asc3 ;'0','1','2','3','4','5','6','7','8','9' subi bin_l,low(100) sbci bin_h,high(100) brsh sub100 subi bin_l,low(-100) ; ldi asc4,'0'-1 ;Re-use bin_h as ASC4 sub10: inc asc4 ;'0','1','2','3','4','5','6','7','8','9' subi bin_l,10 ;Re-use bin_l as ASC5 brsh sub10 subi asc5,-('0'+10) ;Correct negative value and convert it to ASCII ; nop ;ret
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.