Kann in einem unterprogramm ein weiterer "call" Befehl stehen? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Kann in einem unterprogramm ein weiterer "call" Befehl stehen? |
|
|
|
|
BID = 567754
JRJ Gesprächig
Beiträge: 132 Wohnort: Ebbs
|
|
Programmiersprache:
Assembler von Microchip
Kann in einem unterprogramm ein weiterer "call" Befehl stehen?
_________________
Wer in meinem Text Rechtschreibfehler findet darf sie behalten! |
|
BID = 567838
Wusel_1 Stammposter
Beiträge: 220
|
|
Hallo JRJ,
ich programmier zwar nicht mit dem Assembler von Microchip, habe mir aber mal die Befehlstruktur angesehen. Ausgehend davon und von der Assemblerprogrammierung des Z80 ist es eigentlich immer möglich aus einem Unterprogramm ein weiteres Unterprogramm aufzurufen. Du kannst auch im Unterprogramm ein Goto-Befehl benutzen, nur muss dieses Programm dann mit RET enden, damit der Rücksprung wieder in das Programm erfolgt, wo der Call-Befehl stand.
MfG Wusel_1
_________________
DL9UNF
ex Y22MF es Y35ZF
LOC - JO42VP
DOK - Y43 |
|
BID = 567849
DG3YCS Gerade angekommen
Beiträge: 8 Wohnort: Steinfurt
|
Zitat :
JRJ hat am 27 Nov 2008 13:28 geschrieben :
|
Programmiersprache:
Assembler von Microchip
Kann in einem unterprogramm ein weiterer "call" Befehl stehen?
|
Hi,
Für die PIC Serie (Ich vermute mal darauf zielt deine Frage ab) kann ich sagen das es definitiv möglich ist mehrere Unterprogramme zu verschachteln.
Es ist aber die STACK Tiefe zu berücksichtigen (Anzahl der verschachtelten CALL-Befehle) und auf einen sauberen Rücksprung zu achten.
Gruß
Carsten
|
BID = 567997
Racingsascha Schreibmaschine
Beiträge: 2247 Wohnort: Gundelsheim
|
Jepp, das geht, Allerdings gehen maximal nur 8 Call-Stufen (Verschachtelungen), sonst läuft der Stack über. Falls du Interrupts nutzst, darfst du nur 7 Stufen benutzen, sonst läuft der Stack bei einem Interrupt in der 8. Stufe über. -> PIC stürzt ab, bzw macht Murks.
Also entweder
Code : |
.
.
.
call marke1
.
.
.
marke1
call marke 2
return
.
.
.
marke2
mowlw 0xC6
return |
|
Es wird zu marke1 gesprungen, dann zu marke2, dann wird der mowlw ausgeführt. Dann gehts zurück zu marke1 und zum Hauptprogramm.
Oder
Code : |
.
.
.
goto marke1
zurück1
.
.
.
marke1
goto marke2
zurück2
goto zurück1
.
.
.
marke2
movlw 0xC6
goto zurück2 |
|
Es wird zu marke 1 gesprungen, dann zu marke2, wo wieder movlw ausgeführt wird. dann wird zu zurück 2 gesprungen, von wo aus wieder zur Fortsetzung des Hauptprogramms gesprungen wird.
_________________
Fnord ist die Quelle aller Nullbits in deinem Computer.
Fnord ist die Angst, die Erleichterung, und ist die Angst.
Fnord schläft nie.
|
BID = 568009
selfman Schreibmaschine
Beiträge: 1681 Wohnort: Seekirchen a. W.
|
Das ist nicht nur bei den Controllern von Microchip so, sondern bei allen mir bekannten Prozessoren, die einen CALL Befehl kennen!
So ein Befehl macht im Grunde auch nichts anderes als ein JUMP (GOTO) Befehl, nämlich das die im Befehl angegebene Adresse in den Programmcounter (PC) geladen wird. Nur mit dem Unterschied, daß die Adresse, von der der Sprung ausgeführt wird (genau genommen, die Adresse nach dem Befehl) abgepeichert wird. Und dazu wird der aktuelle Inhalt des PC's auf den Stack "gepush't".
Wenn jetzt in der aufgerufenen Routine ein weiterer solcher Befehl auftritt, dann geschieht das Gleich nochmal, und nochmal, und nochmal, .... Mit dem dann notwendigen "RETURN" Befehl wird in umgekehrter Reihenfolge der PC wieder mit der am Stack zuletzt speicherten Adresse geladen (POP), und das Programm macht einen Befehl hinter dem Aufruf durch den CALL Befehl weiter. Das ist dann der Rücksprung.
Wie man sieht brauch man also für jeden weiteren Unterprogrammaufruf einen Speicherplatz für die Rücksprungadresse, und somit wächtst der Stackinhalt immer weiter an. Das kann im Extremfall zum "Stackoverflow" führen, und dann stürzt das Programm ab, weil die Rücksprungadresse nicht mehr gespeichert werden kann.
Allerdings muß man bei händisch geschriebenen Assemblerprogrammen es schon ganz schön bunt treiben, bis das man das erreicht. Gefährlich sind in diesen Belangen eher noch rekursive Programme, also Programme, die sich ganz oder zum Teil immer wieder selber aufrufen und sich damit wie eine Schleife immer weiter einwickeln, bis eine Ende Bedingung erreicht ist und dann die ganze Schleife wieder zurückt rauslaufen. Da kann es schnell mal passieren, daß der Stack überquillt, weil ja je nach Bedingung sich das Programm 10x, 100x, 1000x, oder noch öfter sich selber aufruft und damit eben ein CALL Befehl ausgeführt wird.
PS: Racingsascha hat mich jetzt wieder ein bißchen runtergeholt! Das hatte ich jeztt vergessen, daß die einfachen Microcontroller nicht so viel Speicherplatz bieten und der Stacktbreich auch nicht frei gewählt werden kann, zumindest nicht bei den kleineren Typen.
Schöne Grüße Selfman
[ Diese Nachricht wurde geändert von: selfman am 27 Nov 2008 22:26 ]
|
BID = 568108
JRJ Gesprächig
Beiträge: 132 Wohnort: Ebbs
|
Danke für die Antworten!
_________________
Wer in meinem Text Rechtschreibfehler findet darf sie behalten!
|
BID = 568147
kea5 Stammposter
Beiträge: 356
|
Hallo,
Gruß
[ Diese Nachricht wurde geändert von: Jornbyte am 28 Nov 2008 18:51 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 1 Beiträge verfasst © x sparkkelsputz Besucher : 182421331 Heute : 370 Gestern : 5459 Online : 281 29.11.2024 3:34 0 Besucher in den letzten 60 Sekunden ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0572209358215
|