Brauche Rat bei Assembler programmierung |
11.01.2010, 19:08 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
Wanze | Brauche Rat bei Assembler programmierung hey, also bin neuling in der sache. ich habe folgende aufgabe: "Lies die Zahlen von Port 0 bis Port 4 ein und addiere diese. Gib das Ergebnis auf Port 5 aus, wenn es kleiner 20 ist. Gib das Ergebnis auf Port 6 aus, wenn es gleich 20 ist. Gib das Ergebnis auf Port 7 aus, wenn es größer 20 ist. Auf den Ports für die Ergebnisse (5 bis 7), die nicht für das Ergebnis benutzt werden, soll eine 0 ausgegeben werde." Und folgendes habe ich programmiert: org 0h lxi sp, 200h in 0 ;einlesen mov b, a ;nach b schreiben in 1 ;einlesen add b ;addieren mov b, a in 2 add b mov b, a in 3 add b mov b, a in 4 add b ;akku hat jetzt wert, zb 10 mvi c, 14h ;gibt c wert 20 ;fall 1: ergebnis kleiner 20, a<c cmp c ;wert mit ergebnis in a vergleichen jnc s1 ;fall 2:ergebnis gleich 20 cpi 14h ;vergleich a mit konstante, ist gleich? jnc s2 ;fall3: ergebnis größer 20 mov a, c cmp b jnc s3 s1: out 5 ;ergebnis auf port 5 ausgeben out 6, 0h out 7, 0h s2: out 6 out 5, 0h out 7, 0h s3: out 7 out 5, 0h out 6, 0h end Ich bekomme Fehlermeldungen bei s1 - s3. er will nen semikolon haben. warum?? danke schonmal! |
|||||||||||||||||||||||||
|
||||||||||||||||||||||||||
12.01.2010, 13:38 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
David_pb | Um was für ein Assembler, was für eine Platform, handelt es sich hierbei überhaupt? |
|||||||||||||||||||||||||
12.01.2010, 14:16 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
Wanze | Öhm, Mikroprozessor 8085A. steht im lehrplan. mehr kann ich da jetzt nicht entnehmen. |
|||||||||||||||||||||||||
12.01.2010, 14:34 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
David_pb | Ich hab auf der Platform leider noch nie Programmiert, aber wie ich dem Manual entnehme gibt es die out Instruktion nur in Form out port. Wobei der Inhalt des Akkumulators auf den Port port ausgegeben wird. Dann wäre out 5/6/7, 0h syntaktisch falsch. Übrigens:
Cmp c subtrahiert ja c vom Akkumulator. Carry ist also gesetzt wenn a < c, du springst allerdings wenn Carry nicht gesetzt ist.
Hier führst du den selben Test nochmal durch (diesmal halt per Immediate). Da s2 aber der Fall a == 14h ist solltest du lieber das Zerro-Flag testen.
Hier machst du... was??
Du solltest hier noch bei jedem Fall unbedingt irgendwohin Springen um zu vermeiden, dass die weiteren Fälle auch behandelt werden. Wenn du z.B nach s1 springst wird der Code für s2 und s3 ebenfalls ausgeführt. Hier nochmal zusammenfassend:
Allerdings ungetestet und ohne Gewähr. Ich hab wie gesagt keine praktische Erfahrung mit dieser Platform. |
|||||||||||||||||||||||||
Anzeige | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
12.01.2010, 21:35 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
Wanze | ja klar, stimmt ja! ich gebe mit "out" den akkuinhalt aus. da kann ich nich den wert 0h einfach zuweisen. das könnte schon die lösung meines problems sein. ich teste mal. ja und das mit dem springen ist so ne sache. ich verstehe einfach den unterschied zwischen jnc und jnz nicht. mir wurde gesagt, jnz nehme ich wenn nicht 0 werden soll. aber was ist das carryflag?? lg |
|||||||||||||||||||||||||
12.01.2010, 22:19 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
David_pb | Der Prozessor hat ein Statusregister in dem sich diverse Flags befinden die Informationen über vorangegangene Aktivitäten anzeigen. Das Carry-Flag zeigt dir einen Übertrag (Carry) an, der z.B. bei arithmetischen Operationen entstehen kann: Mal ein Beispiel: Stell dir vor du hast einen 4-Bit Unsigned Datentyp und willst zum Wert 15 eine 1 Addieren. 15 ist ja binär ausgedrückt 1111 (und 1 = 0001). 1111 + 0001 ---------- 0000 = 0 (*huch*, CY = 1) Was ist passiert? Beim addieren ist der Wertebereich übergelaufen (15 ist nun mal der größtmögliche (vorzeichenlose) 4-Bit Wert). D.h. die Addition liefert den Wert 0 und der Übertrag findet sich im Carry-Flag wieder. Entsprechend läuft das bei der Subtraktion (z.B. 3 - 10) 0011 - 1010 ---------- 1001 = 9 (CY = 1) Das Carry-Flag zeigt hier den Unterlauf vom Wertebereich [0, 15] an. Und das passiert natürlich wenn der 2. Operant größer dem 1. Operant ist. Das Zero-Flag weißt darauf hin das irgend ein Ergebnis den Wert 0 hatte. Zum Beispiel wenn du von einem Wert den selben Wert nochmals subtrahierst, also: 1001 - 1001 --------- 0000 = 0 (Z = 1) Genau diese Flags werden bei den Bedingten Sprüngen jXX abgefragt. XX wird dann entsprechend der Bedingung ersetzt, also z.B. mit: NC (=not carry), C (=carry [set]), NZ (=not zero), Z (= zero [set]) usw... Und jetzt mit dem grandiosen neuen Wissen: Die Instruktion cmp führt eine Subtraktion mit Akku und angegebenen Register aus:
Außerdem setzt die Instruktion noch einige Flags (Z, S, P, CY, AC). Wichtig sind hier die (jetzt bekannten) Flags Z und CY. Wenn also der Wert in a gleich dem Wert in c ist, ist das (imaginäre) Ergebnis 0 und das Zero Flag wird gesetzt (ansonsten wird das Zero-Flag natürlich gelöscht). Wenn der Wert in a kleiner als der Wert in c ist, wird das Carry-Flag gesetzt (und im Fall a > c natürlich gelöscht). Und diese Information kann dann zum bedingten Springen verwendet werden. Ich hoffe das bringt dir etwas Klarheit. |
|||||||||||||||||||||||||
13.01.2010, 22:06 | Auf diesen Beitrag antworten » | |||||||||||||||||||||||||
Wanze | ui danke dir! ich hatte soeben eine erleuchtung!! so aus der warte hat mir das noch keiner erklärt. mein prof is nich so der erklär-bär. aber jetzt versteh ich das erstmal. yeah !! ich danke dir! |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|