Brauche Rat bei Assembler programmierung

Neue Frage »

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!
 
Auf diesen Beitrag antworten »
David_pb

Um was für ein Assembler, was für eine Platform, handelt es sich hierbei überhaupt?
Auf diesen Beitrag antworten »
Wanze

Öhm, Mikroprozessor 8085A. steht im lehrplan. mehr kann ich da jetzt nicht entnehmen.
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:
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?? verwirrt

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.
 
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
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:

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.
Auf diesen Beitrag antworten »
Wanze

ui danke dir! ich hatte soeben eine erleuchtung!! Daumen hoch

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 !! Rock
ich danke dir! Gott
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »