mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Branch zu bestimmter Zeile


Autor: Susanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Erst einmal muss ich zugeben, dass ich keine Ahnung von Assembler habe. 
Ich sollte eine Hausaufgabe zu folgendem Pseudocode machen:
erg:=erg*5
do
erg:=erg-1
while erg>0

So sieht mein Code bis jetzt aus:
WAIT     * Stelle 1
         Mulu #$FFFF,D0
  SUB #$0001,D0
  CMP #$0,D0
  BHI WAIT
  
         *Stelle 2
  RTS
  END START

Mein Problem: Das Programm springt zu WAIT und damit zu "Mulu". Wie kann 
man dem Programm sagen, dass es Mulu umgehen soll? Vielleicht mit einer 
Zeilenangabe? (Also: springe zu Zeile "20")

Hinweis: Wir sollen Mulu, SUB und BHI verwenden! und uns stehen auch nur 
die Zeilen Zwischen Stelle 1 und Stelle 2 zur Verfügung.


Schon mal vielen Dank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Susanne wrote:

> Mein Problem: Das Programm springt zu WAIT und damit zu "Mulu". Wie kann
> man dem Programm sagen, dass es Mulu umgehen soll? Vielleicht mit einer
> Zeilenangabe? (Also: springe zu Zeile "20")

Ähm.
Indem du ein weiteres Label einführst, das du als Sprungziel nimmst?

WAIT     * Stelle 1
  Mulu #$FFFF,D0
WAIT_1
  SUB #$0001,D0
  CMP #$0,D0
  BHI WAIT_1

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Je nach Architektur auch möglich:
 WAIT     * Stelle 1
          Mulu #$FFFF,D0
   SUB #$0001,D0
   CMP #$0,D0
   BHI WAIT+1 *Springe zu WAIT + 1 Befehl
 
          *Stelle 2
   RTS
   END START
 

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst ein zweites Label für die Warteschleife (WaitLoop)
WAIT     
   MULU #5,D0       ; D0 mal 5
WaitLoop
   SUB #$0001,D0
   CMP #$0,D0
   BHI WaitLoop     ; ungleich 0? --Schleife
   RTS
   END START

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Susanne wrote:
> Erst einmal muss ich zugeben, dass ich keine Ahnung von Assembler habe.

Assembler ist Maschinensprache, d.h. läuft nur auf einer ganz 
bestimmten.

Also zuerst mal sagen, um was für ein Target es überhaupt geht.


Peter

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Susanne,

welchen Sinn soll denn der Code haben, erg ist am Ende immer null, jeder 
bessere Compiler wird das einfach umsetzen in:

CLR erg;

Wenn du es unbedingt ohne Optimierung hinschreiben willst, was da 
passiert, musst du schon dazusagen, was die Befehle mulu, sub und bhi 
genau machen und welche Speicheradressen du verwendest.

Das ist jetzt geraten:

mulu r,d = multiply unsigned; d = d*r;

sub r,d = subtract; d = d-r;

bhi r = branch if higher; branch to r if positive flag is set;

Wenn das so ist, würde es wohl so aussehen (in D0 steht erg):

WAIT
     mulu 0x05,D0;
dowhile
     sub 0x01,D0;
     bhi dowhile;

     rts;
     end start;

Der sub Befehl sollte eigentlich das positive Flag für das Ergebnis 
bereits setzen. Aber wie gesagt, das so zu compilieren ist absoluter 
Blödsinn, weil für erg eh immer Null rauskommt.

Grüße,

Peter

Autor: Susanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, danke... War mir erst nicht ganz sicher ob das so geht... Dachte 
es gibt eine Möglichkeit eine bestimmte Zeile direkt anzusprechen...

Autor: Susanne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sollte als Zählschleife gelten. Eben eine bestimmte Zeit t=5 die 
gewartet werden soll. Stand so in der Aufgabenstellung

Also es ging um Motorolla 68000...


@Läubi: Danke, genau das meinte ich :)



Okay, nun läuft es wie gewünscht!

Autor: Gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt so schöne Befehle wie: DBNE, DBHI oder allgemein DBcc.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Susanne wrote:
> Okay, danke... War mir erst nicht ganz sicher ob das so geht... Dachte
> es gibt eine Möglichkeit eine bestimmte Zeile direkt anzusprechen...

Ja, die gibt es. Ist ganz einfach.
Versieh die Zeile mit einem Label und spring es an.

Das kommt mir komisch vor

  SUB #$0001,D0

Ist das beim Motorola Assembler wirklich so?
Normalerweise bezeichnet doch das erste Argument immer die Quelle und 
das Ziel. Umgangssprachlich gelesen: Ziehe von D0 eins ab.
In Assembler geschrieben

   SUB D0, #$0001

Autor: Gasst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das kommt mir komisch vor

Das ist wirklich so :-) Ebenfalls wird von links nach rechts bewegt:

MOV D0,D1; wobei D1 den Wert von D0 erhält.

Renesas macht dies bei den H8-Prozessoren auch so. Man gewöhnt sich 
schnell daran.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gasst wrote:

> Renesas macht dies bei den H8-Prozessoren auch so. Man gewöhnt sich
> schnell daran.

Bei Vergleichsoperationen ist die Lernkurve etwas länger, weil die 
dieser Logik folgend verkehrt herum dastehen.

Was dann auch manche Hersteller dazu bewogen hat, bei Vergleichsbefehlen 
die Operanden wieder andersum hinzuschreiben, wodurch die eigentlich 
sehr ähnlichen Vergleiche und Subtraktionen etwas auseinander laufen 
(war glaube ich bei DEC PDP+VAX so). Wieder andere haben statt dessen 
die Flags passend vermurkst (TI). Motorola war immerhin konsequent, denn 
solche Tricks machen es summarum nicht wirklich einfacher.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Diener wrote
> welchen Sinn soll denn der Code haben...
Das erste Label heißt WAIT.
Ab da kann man nur noch raten...   ;-)

> jeder bessere Compiler wird das einfach umsetzen in ...
Ja, aber ein Assembler nicht.
Der hat das so umzusetzen, wie es dasteht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.