Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Brauche Rat bei Assembler programmierung » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Brauche Rat bei Assembler programmierung
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Wanze Wanze ist weiblich
Grünschnabel


images/avatars/avatar-39.jpg

Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen

Brauche Rat bei Assembler programmierung Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Wanze ist offline E-Mail an Wanze senden Beiträge von Wanze suchen Nehmen Sie Wanze in Ihre Freundesliste auf
David_pb
Mitglied


Dabei seit: 01.06.2007
Beiträge: 44

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Um was für ein Assembler, was für eine Platform, handelt es sich hierbei überhaupt?
12.01.2010 13:38 David_pb ist offline E-Mail an David_pb senden Beiträge von David_pb suchen Nehmen Sie David_pb in Ihre Freundesliste auf
Wanze Wanze ist weiblich
Grünschnabel


images/avatars/avatar-39.jpg

Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Ö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 Wanze ist offline E-Mail an Wanze senden Beiträge von Wanze suchen Nehmen Sie Wanze in Ihre Freundesliste auf
David_pb
Mitglied


Dabei seit: 01.06.2007
Beiträge: 44

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von David_pb: 12.01.2010 14:45.

12.01.2010 14:34 David_pb ist offline E-Mail an David_pb senden Beiträge von David_pb suchen Nehmen Sie David_pb in Ihre Freundesliste auf
Wanze Wanze ist weiblich
Grünschnabel


images/avatars/avatar-39.jpg

Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 Wanze ist offline E-Mail an Wanze senden Beiträge von Wanze suchen Nehmen Sie Wanze in Ihre Freundesliste auf
David_pb
Mitglied


Dabei seit: 01.06.2007
Beiträge: 44

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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 David_pb ist offline E-Mail an David_pb senden Beiträge von David_pb suchen Nehmen Sie David_pb in Ihre Freundesliste auf
Wanze Wanze ist weiblich
Grünschnabel


images/avatars/avatar-39.jpg

Dabei seit: 11.01.2010
Beiträge: 9
Herkunft: Thüringen

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

__________________
++Hast du Feuerschweif am Heck, spült das Wasser alles weg++
13.01.2010 22:06 Wanze ist offline E-Mail an Wanze senden Beiträge von Wanze suchen Nehmen Sie Wanze in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Brauche Rat bei Assembler programmierung