Forum: Mikrocontroller und Digitale Elektronik asm 16bit Wörter vergleichen


von Bruno M. (brumay)


Lesenswert?

Hallo,

Ich habe eine Zahlenreihe wie:

587,591,595,599,603,607,611,614,618,622,626,630,634,638
nur als Beispiel, da die Reihe wesentlich länger ist.

als hex:
024B,024F,0253,0257,025B,025F,0263,0266,026A,026E,0272,0276,027A,027E

wie kann ich nun mit einem Vergleich in asm herausfinden, zwischen 
welchen Werten der Wert 616 liegt.

Da ich low und high einzeln vergleichen muß, funktionieren breq, brlo 
oder brsh ja nicht.

Dank im Voraus

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Nimm einfach einen anderen Assembler. Einen der 16bit Vergleiche kann.

SCNR,
WK

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Angehängte Dateien:

Lesenswert?

Atmel hat damals einen kleinen Programmfetzen publiziert, der bei 16-Bit 
Operationen hilft. Ich hänge dir das mal an.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bruno M. schrieb:
> Da ich low und high einzeln vergleichen muß
Bei einem 16-Bit oder 32-Bit Prozessor geschieht das auf einmal.

> wie kann ich nun mit einem Vergleich in asm herausfinden
Das kommt ganz auf den Prozessor an. Aber generell läuft das über 
Vergleiche. Und Vergleiche beruhen auf einer Subtraktion. Du brauchst 
also eine 16-Bit-Subtraktion, wenn du nur einen 8-Bit-Prozessor hast.

> wie kann ich nun mit einem Vergleich in asm herausfinden
Wie würdest du es denn handschriftlich machen?
Doch etwa so:
1. Berechne Tabellenwert-616.
2. Wenn das Ergebnis negativ ist, dann nimm den nächsten Tabellenwert 
und weiter bei 1.

> zwischen welchen Werten der Wert 616 liegt.
Muss in deinem Fall der Wert 7 und 8 herauskommen? Oder 614 und 618?

: Bearbeitet durch Moderator
von Theor (Gast)


Lesenswert?

Du musst natürlich (abgesehen von einem Sonderfall) beide Bytes eines 16 
Bit Wortes vergleichen, kommst also, wie Du ganz richtig sagst, mit 
einem einzelnen cmp-brxx nicht aus.

Allerdings, - das ist der erwähnte Sonderfall -, kannst Du zuerst das 
High-Byte der beiden Zahlen vergleichen. Sind die High-Bytes ungleich, 
ist ein Vergleich des Low-Bytes unnötig. Die Entscheidung kann schon 
getroffen werden.

von Bruno M. (brumay)


Lesenswert?

Danke für die Antworten!

Vermutlich habe ich auf der Leitung gestanden. Mein Problem existiert ja 
nur dann wenn ich zuerst alle high und dann alle low vergleiche (und so 
habe ich es zuerst realisiert). Man kann natürlich die Werte einzeln 
durchtesten.

von Theor (Gast)


Lesenswert?

Bruno M. schrieb:
> Danke für die Antworten!
>
> Vermutlich habe ich auf der Leitung gestanden. Mein Problem existiert ja
> nur dann wenn ich zuerst alle high und dann alle low vergleiche (und so
> habe ich es zuerst realisiert). Man kann natürlich die Werte einzeln
> durchtesten.

Richtig.

Aber Du brauchst auch nicht alle Werte vergleichen.
Dafür gibt es die sogenannte "binäre Suche". Siehe 
https://de.wikipedia.org/wiki/Bin%C3%A4re_Suche

Nimm an Du hast n=14 Werte in der Tabelle. Dann benötigst Du im 
schlechtesten Fall ceil(log2(n)+1) = 5 Vergleiche.

Falls Du dazu noch Fragen hast, frag einfach. Es ist m.M.n. normal, beim 
ersten Versuch, das zu implementieren, Probleme zu kriegen.

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.