Wollte mal fragen ob es ne Art Switch Case Anweisung auf Assembler gibt. Muss nämlich zwischen 35 verschiedenen Eingangskombinationen entscheiden können. Und mit cjne jedesmal kriegt man ja nen halben Kilometer Source noch dazu ist es total unübersichtlich. mfg Markus
Das kann man in Assembler wunderbar mit einer Sprungtabelle lösen. Allerdings ist die Ausführung abhängig vom Prozessortyp, den ich nun leider nicht erraten kann... Es gibt zu dieser Frage auch schon einige Antworten hier im Forum - die Such-Funktion hilft hier weiter.
Das schnellste ist "jmp @A+DPTR". DPTR mit Anfangsadresse einer Sprungtabelle laden, die switch-Variable nach A, fertig. Heist natürlich im schlimmsten Fall, eine Tabelle mit 256 Sprungvektoren (wobei die meisten natürlich zur default-Routine zeigen) zu basteln, sollte man also vorher eingrenzen.
mir fällt nur das hier ein: mov eax, WERT cmp eax, 1 jz case1 cmp eax, 2 jz case2 cmp eax, 3 jz case3 jmp ende case1: ... jmp ende case2: ... jmp ende case3: ... jmp ende ... ende: ... so spontan ;) is auch ganz übersichtlich finde ich.. du kannst die case routinen auch gleich oben beim vergleich reinpacken, nur dann wirds erst recht unübersichtlich .. vor allem musst du dann aufpassen, was du mit was überhaupt vergleichst, ev. helfen dann push pop anweisungen.. mfg Stephan
Einfache Version für A = 0..127: add a, acc mov dptr, #switchtab1 jmp @a+dptr switchtab1: ajmp case0 ajmp case1 ... ajmp case127 Peter
ggf. kannst du a noch eins oder zweimal nach links rotieren und erhällst so Platz für zwei oder vier Befehle in deiner Tabelle. Wenn dir drei Befehle für dein Case-Bearbeitung genügen kannst du dir so die switchtab1: mit den ajmp case n sparen.
Wenn die 35 Fälle nicht brav von null bis 34 liegen, sondern im Extremfall von null bis 255 verstreut, lohnt sich eine Tabelle mit jeweils Indexwert und Adresse. Dann werden der Reihe nach die Indexwerte geladen und mit dem switch-Wert verglichen, bis er paßt. Beim passenden wird dann die zugehörige Adresse geladen und indirekt angesprungen. Braucht einen Bruchteil des Platzes mit minimaler Performanceeinbuße. (Sorry, kein Code mangels 8051-Assembler-Kenntnissen)
Erstmal Danke für die ganzen Antworten! Ich glaub ich habe vergessen was zu erwähnen oder verstehe euch falsch. Wie ich das lese geht ihr davon aus, dass der MC 1 Byte empfängt und das die 35 verschiedenen Kombinationen beinhaltet. Dem ist aber nicht so. Es wird ein komplettes Datenwort in der Form $E35% geschickt. Das $ sagt dem MC dass ein Befehl kommt, das % zeigt das Ende an.Also nicht weiter wichtig für meine Frage. An erster Stelle kann ein E für Einzelwandlung oder ein K für kontinuierliches Wandeln stehn (2 Möglichkeiten) an der dritten Stelle können die zu Wandelnden Kanäle stehen 1-3 (3 Möglichkeiten)und an der vierten Stelle wird mit 1-7 gesagt in welchen Zeitabständen der MC wandeln und verschicken soll (7 Möglichkeiten). Multipliziere ich alle Möglichkeiten miteinander (2x3x7) komme ich auf 42Möglichkeiten. So war das gemeint. Und das mit der Sprungtabelle funktioniert ja nur wenn ich nur eine Variable habe. Korrigiert mich falls ich falsch liege. Ich suche etwas um dies hier zu realisieren: case Wort =>"E35" : =>wandlung=1 case Wort =>"E26" : =>wandlung=2 ...... Das Beispiel hat jetzt keinerlei Sinn oder beinhaltet tiefgründigere Gedanken ;-) Über weitere Tipps wäre ich sehr dankbar mfg Markus
Welcher Prozessor mag Stringbearbeitungsfunktionen als Assemblerbefehler integriert haben? Du solltest Deine Steuerwörter mit einem simplen Algorithmus in einen einzelnen numerische Werte umwandeln und ab da mit der Sprungtabelle weitermachen ... sowas in der Art wie wenn E dann Wert = 0 wenn K dann Wert = 100 Wert += zu wandelnde Kanäle * 10 Wert += Zeit E35 wird so zu 35 K17 wird so zu 117 Alles klar?
Dann lieber direkt in einen kompakten Tabellenzeiger wandeln: lade zweiten Char ;da haben wir jetzt '1', '2' oder '3' dec and 3 ;jetzt ist es 0, 1 oder 2 swap nibbles ;macht $00, $10 oder $20 wenn 1. Char = 'E' or $08 den 3. Char mit and $07 mit obigem verodern Schon haben wir den String in ein Byte von null bis 47 verwandelt. Also brauchen wir nur eine Tabelle mit 48 Adreßeinträgen, aus der wir über dieses Byte indirekt laden und diese Adresse wird dann angesprungen. Allerdings: dabei gehen wir davon aus, daß es keine Übertragungsfehler oder falsche Syntax gibt. Bei einem unsinnigen String würde das Programm wild irgendwohin springen!
Kannst du nicht die 3 Kriterien getrennt (nacheinander) auswerten? Das eine stellt den Messmodus (Wandlungsart) ein, das andere den Quellkanal, das dritte stellt den Timer, wann gemessen werden soll. So hast du für jedes Kriterium eine einfache Auswertung.
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.