www.mikrocontroller.net

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


Autor: Bernhard (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: plitzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen Jörg,

könntest Du uns bitte den Link benennen,

in dem Du das andere Vefahren gefunden hast?

Danke

Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Bernhard,

vielleicht das hier.


Peter

Autor: plitzi (Gast)
Datum:

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

Jörg

Autor: nestandart (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; http://www.telesys.ru/wwwboards/mcontrol/297/messa...
;
;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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.