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
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
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
alo, mein name ist fatmir. i habe eine frage? wie kann man bedingte sprünge auswerten??#
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.)
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?"