Brauche Rat bei Assembler programmierung |
Wanze
Grünschnabel
Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen
|
|
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!
__________________ ++Hast du Feuerschweif am Heck, spült das Wasser alles weg++
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Wanze: 12.01.2010 12:35.
|
|
11.01.2010 19:08 |
|
|
David_pb
Mitglied
Dabei seit: 01.06.2007
Beiträge: 44
|
|
Um was für ein Assembler, was für eine Platform, handelt es sich hierbei überhaupt?
|
|
12.01.2010 13:38 |
|
|
Wanze
Grünschnabel
Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen
|
|
Öhm, Mikroprozessor 8085A. steht im lehrplan. mehr kann ich da jetzt nicht entnehmen.
__________________ ++Hast du Feuerschweif am Heck, spült das Wasser alles weg++
|
|
12.01.2010 14:16 |
|
|
David_pb
Mitglied
Dabei seit: 01.06.2007
Beiträge: 44
|
|
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:
code: |
1:
2:
3:
4:
|
;fall 1: ergebnis kleiner 20, a<c
cmp c ;wert mit ergebnis in a vergleichen
jnc s1 |
|
Cmp c subtrahiert ja c vom Akkumulator. Carry ist also gesetzt wenn a < c, du springst allerdings wenn Carry nicht gesetzt ist.
code: |
1:
2:
3:
|
cpi 14h ;vergleich a mit konstante, ist gleich?
jnc s2 |
|
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.
code: |
1:
2:
3:
4:
5:
|
;fall3: ergebnis größer 20
mov a, c
cmp b
jnc s3 |
|
Hier machst du... was??
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
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
|
|
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:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
|
; port 5, 6 und 7 auf 0 setzen
xra a
out 5
out 6
out 7
; code wie oben ...
cpi 14h
jc s1
jz s2
; wenn a > 14h
out 7
shut:
jmp 0 ; bzw irgenwohin springen um das programm zu beenden!!
; wenn a < 14h
s1: out 5
jmp shut
; wenn a = 20h
s2: out 6
jmp shut
end
|
|
Allerdings ungetestet und ohne Gewähr. Ich hab wie gesagt keine praktische Erfahrung mit dieser Platform.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von David_pb: 12.01.2010 14:45.
|
|
12.01.2010 14:34 |
|
|
Wanze
Grünschnabel
Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen
|
|
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
__________________ ++Hast du Feuerschweif am Heck, spült das Wasser alles weg++
|
|
12.01.2010 21:35 |
|
|
David_pb
Mitglied
Dabei seit: 01.06.2007
Beiträge: 44
|
|
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:
code: |
1:
2:
3:
|
cmp c ; a - c
|
|
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.
|
|
12.01.2010 22:19 |
|
|
Wanze
Grünschnabel
Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen
|
|
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!
__________________ ++Hast du Feuerschweif am Heck, spült das Wasser alles weg++
|
|
13.01.2010 22:06 |
|
|
|