asm 16bit Wörter vergleichen

OP #6181123
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
Moderator (Firma: Titel) Persönliche Seite #6181139
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?
Gast #6181140
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.
Gast #6181167
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren