www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bedigntes Call??


Autor: A. C. (michael1988)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI
Ich bin schon seit längerem am Schreiben von Assemblercode und ärgere 
mich immer wieder, dass man bei Bedingungen immer mit bedingten Sprüngen 
immer so um die Ecke denken muss. Gibt es nicht irgendwie einen Befehl 
oder eine Möglichkeit,wie man bedingte calls regeln könnte?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Michael D. (michael1988)

>Ich bin schon seit längerem am Schreiben von Assemblercode

Mit welchem Prozessor?

>und ärgere
>mich immer wieder, dass man bei Bedingungen immer mit bedingten Sprüngen
>immer so um die Ecke denken muss.

???
Wieso das? Man kann schön auf Gleichheit, Ungleicheit, grösser/kleiner 
vergleichen und springen.

> Gibt es nicht irgendwie einen Befehl
>oder eine Möglichkeit,wie man bedingte calls regeln könnte?

Das sind aber Funktionsaufrufe, keine Sprünge!

MFG
Falk

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Michael,

ich muss ja zugeben, das ich mir da auch manchmal den Intellekt 
verbiege.
Das hat meistens damit zu tun, das ich mir über die eigentliche 
Fallunterscheidung nicht klar bin und das erst beim schreiben 
"erarbeite".
Was sind denn Deine konkreten Probleme?

Hilfreich könnte eine Tabelle in dem Atmel-Dokument zum Befehlssatz 
sein. Dort gibt es eine Tabelle, in derm an sich nach der zu testenden 
Bedingung den Befehl heraussuchen kann.

Gruß
Oops

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael D. wrote:
> HI
> Ich bin schon seit längerem am Schreiben von Assemblercode und ärgere
> mich immer wieder, dass man bei Bedingungen immer mit bedingten Sprüngen
> immer so um die Ecke denken muss. Gibt es nicht irgendwie einen Befehl
> oder eine Möglichkeit,wie man bedingte calls regeln könnte?
jc drumherum
call irgendwas
drumherum:


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops wrote:

> Das hat meistens damit zu tun, das ich mir über die eigentliche
> Fallunterscheidung nicht klar bin und das erst beim schreiben
> "erarbeite".

Endlich mal einer, der es zugibt.

Das Problem ist nämlich, daß man sich vorher keinen Ablaufplan gemacht 
hat und das Programm einfach wachsen läßt.

Die Zeit die man vorher beim Nichterarbeiten des Plans gespart hat, legt 
man dann bei Schreiben (und Debuggen) des Programms mindestens 10-fach 
wieder zu.


Peter

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:


>>Das Problem ist nämlich, daß man sich vorher keinen Ablaufplan gemacht
>>hat und das Programm einfach wachsen läßt.

Das Problem ist noch gar nicht klar. Michael D. hat noch nicht 
geschrieben was er für ein konkretes Problem hat und was er verbessern 
möchte.

Gruss
Oops.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Oops (Gast)

>Das Problem ist noch gar nicht klar. Michael D. hat noch nicht
>geschrieben was er für ein konkretes Problem hat und was er verbessern
>möchte.

Also die Standardlösung.

42

MfG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
Oops wrote:
> @Peter:
>
>
>>>Das Problem ist nämlich, daß man sich vorher keinen Ablaufplan gemacht
>>>hat und das Programm einfach wachsen läßt.
>
> Das Problem ist noch gar nicht klar.

Na ja. Mann muss kein Hellseher sein um die obige Behauptung
aufstellen zu können :-)

> Michael D. hat noch nicht
> geschrieben was er für ein konkretes Problem hat und was er verbessern
> möchte.

Sein konkretes Problem ist, dass es keinen 'call if zero',
'call if carry', etc... gibt, und er daher immer die Bedingung
umdrehen muss um mit einem bedingtem Sprung rund um den call
herumzuspringen.

Mit Assembler Makros müsste sich doch da was machen lassen.
PeDa!!!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Karl heinz Buchegger (kbuchegg)

>Sein konkretes Problem ist, dass es keinen 'call if zero',
>'call if carry', etc... gibt,

Stimmt nicht. Beim Picoblaze gibts sowas, recht praktisch.

http://www.xilinx.com/bvdocs/appnotes/xapp213.pdf

Seite 8

MFG
Falk

Autor: Oops (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk Brunner

>>Also die Standardlösung.

>>42

:-)

Gruss
Oops.

Autor: Martin Cibulski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

auch der ARM-Prozessor kann bedingte Unterprogrammaufrufe.
Fast alle Befehle haben dort 4 Bits für die bedingte
Ausführung eingebaut, auch der BL-Befehl, der dem CALL
entspricht.

Gruß,
Martin Cibulski

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Z80 hatte sowas auch, aber ich glaube mich zu erinnern, dass man
es am Ende doch eher selten benutzt hat.  Meist muss man außer dem
eigentlichen CALL doch noch irgendwelche Dinge davor oder danach
erledigen, da führt dann um den Sprung kein Weg herum.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man wunderbar mit Makros regeln. Wie hängt allerdings vom Assembler 
ab, notfalls kann man auch den cpp (c präprozessor) drauf loslassen. 
Damit kann man dann automatisch die entsprechenden Labels erzeugen 
lassen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ I_ H. (i_h)

>Kann man wunderbar mit Makros regeln.

Na dann zeig das mal für den AVR und seinen Assembler (AVR-Studio).

MfG
Falk

Autor: Martin Cibulski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Na dann zeig das mal für den AVR und seinen Assembler (AVR-Studio).

Vielleicht so ähnlich wie:

MACRO CALLNE %1
   .byte XXX
   CALL %1
ENDMAC

(ich habe AVR-Studio nicht hier, kann die Syntax daher nicht prüfen)

CALLNE soll das Programm aufrufen, wenn NOT EQUAL erfüllt ist.
Für XXX müsste man den Opcode für einen BEQ-Befehl einsetzen,
der genau einen Befehl überspringt.

Gruß,
Martin Cibulski

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.macro  rcallne
  breq  PC+2
  rcall  @0
.endmacro

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Der Z80 hatte sowas auch, aber ich glaube mich zu erinnern, dass man
> es am Ende doch eher selten benutzt hat.  Meist muss man außer dem
> eigentlichen CALL doch noch irgendwelche Dinge davor oder danach
> erledigen, da führt dann um den Sprung kein Weg herum.


Ich hab auch mit dem Z80 (U880) angefangen. Die bedingten Calls fand ich 
ganz lustig, aber in der Praxis hat man sie eigentlich nie benutzt (aus 
den von Dir genannten Gründen).

Daher habe ich sie dann später beim 8051 überhaupt nicht vermißt.


Peter

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Na dann zeig das mal für den AVR und seinen Assembler

Beim GNU-Assembler würde sowas gehen:
.macro  rcallne tgt
        breq    1f
        rcall   \tgt
1:
.endm

Der Atmel-Assembler ist ja sowieso eher ein mageres Teil.

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt, hängt stark vom Assembler und dessen Makrofähigkeiten ab. 
Das Konzept ist aber immer das selbe, nimm eine Makrovariable die du bei 
jeder Instanziierung vom Makro hochzählst, und dann erzeugst du einfach 
'n Label abc_[nummer] und springst dahin.

Oder die Leute, die des Assembler geschrieben haben, haben mitgedacht 
und nehmen dir die Nummerierung von Makrolabels ab. Findest du bei 
OpenSource Sachen zB. oft, weil die Leute üblicherweise selber damit 
arbeiten ;).

Dem GPASM hab ich irgendwann mal If Blöcke, While Schleifen, 
Variablentypen und so'n Zeugs beigebracht. Aber das ist dann nicht mehr 
so ganz trivial.

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.