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
Moin, Nimm einfach einen anderen Assembler. Einen der 16bit Vergleiche kann. SCNR, WK
Atmel hat damals einen kleinen Programmfetzen publiziert, der bei 16-Bit Operationen hilft. Ich hänge dir das mal an.
:
Bearbeitet durch User
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.