Forum: Projekte & Code HEX-ASC Wandlung 16 Bit (Assembler) nur 5 Register


von Bernhard (Gast)


Angehängte Dateien:

Lesenswert?

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

von plitzi (Gast)


Lesenswert?

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

von Bernhard (Gast)


Lesenswert?

Hallöchen Jörg,

könntest Du uns bitte den Link benennen,

in dem Du das andere Vefahren gefunden hast?

Danke

von peter dannegger (Gast)


Angehängte Dateien:

Lesenswert?

@Bernhard,

vielleicht das hier.


Peter

von plitzi (Gast)


Lesenswert?

Ja, genau da. Ist schon recht clever gelöst, finde ich, oder?

Jörg

von nestandart (Gast)


Lesenswert?

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 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
Noch kein Account? Hier anmelden.