Forum: Mikrocontroller und Digitale Elektronik bedingte Spruenge in Assembler und sdcc Frage


von Tim (Gast)


Lesenswert?

moin,

ich als ahnungsloser, eigentlich C Programmierer wollte mal etwas Asm
basteln und habe in meiner Atmel Referenz fuer 8051er als einzige
Sprungbefehle den CJNE gefunden. Wie kann ich den sowas wie kleiner
oder groesser abfragen?

Dann hab ich noch ne Frage zu sdcc: wenn ich damit ein Progamm schreibe
ist das Ergebnis recht komisch. Der Code hat im Simulator am Anfang
viele NOPs und Spruenge. Etwa sowas

LCALL <irgendwas>
RETI
NOP
NOP
NOP
NOP
RETI
NOP
NOP
NOP
NOP
RETI

 und das etwa 6 mal. Das eigentlich Programm faengt dann erst bei
<igendwas> and

Ist das normal?

TIM

: Verschoben durch User
von Peter D. (peda)


Lesenswert?

Erstmal, Du bist hier in der Codesammlung, d.h. hier stehen nur fertige
Beispiele und keine Fragen.

Aber das sollte Dir eigentlich schon der Text gesagt haben, der ganz
groß und fett gedruckt über Deinem Posting gestanden hat !!!


Aber ich will mal nicht so sein.
Der SDCC legt warscheinlich Pseudo-Interupt-Handler an, sobald ein
Interrupt nicht benutzt wird.

Das sieht man zwar oft, ist aber grundsätzlich falsch.
Nicht benutze Interrupts sollten z.B. mit "CLR EA" + "JMP $" belegt
werden, d.h. daß man auch wirklich merkt, daß man einen Fehler gemacht
hat. Ein "RETI" verschleiert den Fehler doch nur.


Werden Interrupts angesprungen, für die man keinen Handler hinterlegt
hat, dann ist das ein schwerwiegender Programmierfehler und dann ist es
besser, wenn sich dieser so früh, wie möglich bemerkbar macht und nicht
erst, nachdem man 1.000.000 Geräte fehlerhaft ausgeliefert hat.

Deswegen ist auch ein "JMP 0000" bei unbenutzen Interrupts genau so
krank.


Peter

von Conlost (Gast)


Lesenswert?

Hallo Tim,
es ist schon ein paar Jahre her das ich mit der 51ger Familie
gearbeitet habe.
Um nach dem Befehl CJNE festzustellen ob grösser oder kleiner
mußt du das Statuswort im Special-Funktion-Register auswerten.
Das CY - bit gibt an ob ein Überlauf im Accu stattgefunden hat.

Gruß,
Arno

von Sucuk (Gast)


Lesenswert?

alo, mein name ist fatmir. i habe eine frage? wie kann man bedingte 
sprünge auswerten??#

von Marek N. (Gast)


Lesenswert?

Tim schrieb:
> LCALL <irgendwas>
> RETI
> NOP
> NOP
> NOP
> NOP
> RETI
> NOP
> NOP
> NOP
> NOP
> RETI

Das sind die Interrupt-Vektoren.
Der Compiler reserviert im Startup-Code diese Tabelle, da er ja nicht 
wissen kann, ob im Hauptprogramm dieser Interrup noch angelegt wird oder 
gar per Inline-Assembler zwischengequetscht wird.

Sollte aus welchem Grund auch immer, das entsprechende Interrupt-Flag 
gesetzt werden, springt das Programm den entsprechenden Interrupt an, 
arbeitet dort die paar NOPs ab und springt wieder sauber zurück und 
löscht das das Flag auch.
Von daher ist so eine Tabelle schon sinnvoll.
Wenn mann ab Adresse 0x0003 schon mit dem Programm beginnt, weil man 
meint, keine Interrupts zu benutzen und setzt dann doch mal ein Flag, 
sprigt das Programm irgendwo in seine Start-Sequenz und schmiert 
bestenfalls nur ab oder macht schlimmstensfalls irgenwelche schwer 
vorhersagbaren Dinge (partielle Initialisierung etc.)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Sucuk schrieb:
> alo, mein name ist fatmi
Beschreib bitte dein Problem in einem NEUNEN Thread so, dass DIR 
geholfen und nicht zufällig auf eine 15 Jahre alte Frage geantwortet 
wird.

Lies dazu auch den Beitrag "Re: Pin6 is I/O pin - wie umstellen?"

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.