Hallo, meine frage ist zum verständniss wie der controler arbeitet. Wenn ich ein assambler file in ein .hex file umwandle, so kann ich darin jeden einzelnen befehl wiederfinden, bis auf die schleife (zb loop). Bsp. ----------------------------------- include at89c5131.inc code at 0 loop: mov p2,p1; sjmp loop end ----------------------------------- .hex file: :050000008590A080FBCB :00000001FF ------------------------------------ woher weis der controler nun wohin er springen muss denn darin erkenne ich die "loop" nicht. Wäre nett wenn mir das jemand hier raus suchen könnte. danke schonmal im vorraus.
peter peter schrieb: > woher weis der controler nun wohin er springen muss denn darin erkenne > ich die "loop" nicht. wenn du das hex file verstehen willst, dann musst es mit mit den Opcode aus dem datenblatt dekodieren.
80FB ist der Sprungbefehl sjmp loop. Wenn man die Sprungweite (FB) aufdröselt, landet man auf dem Byte mit dem Inhalt 85. Das durfte der Beginn des MOV-Befehls sein (8590A0).
Man kann den Assembler auch anweisen, ein ASM Listing zu generieren. Dann wird's einfacher.
Solltest vielleicht die OP-Codes deines Prozessors in sinnvoller Reihenfolge (z. B. ein simples LED-blinky Programm) mit Hilfe eines Hex-Editors in ein Binär-file schreiben, also die Arbeit des Assemblers übernehmen und das bin-file in den Controller flashen. Habe das selber früher gemacht und dabei en passant die letzten Interna des Prozessors kennengelernt.
Hi, Du hast den Compiler nicht gesagt aber wahrscheinlich GCC? Es gibt eine Hex File format, sogenannte Intel Hex File (http://de.wikipedia.org/wiki/Intel_HEX) Dort gibt es einige Information. Loop ist ein "Alias" für eine Adresse. In welche Addresse das "Loop" landet, oder besser gesagt welche Adresse als Loop markiert wird, bestimmt der Linker.
>Loop ist ein "Alias" für eine Adresse. In welche Addresse das "Loop"
landet, oder besser gesagt welche Adresse als Loop markiert wird,
bestimmt der Linker.
Nicht zwingend. Hier ist es ein relativer Jump mit 4 byte zurueck oder
so.
Hi >Loop ist ein "Alias" für eine Adresse. In welche Addresse das "Loop" >landet, oder besser gesagt welche Adresse als Loop markiert wird, >bestimmt der Linker. Was für ein Linker? 'Loop' steht genau an der Stelle, die durch die Summe der Länge der Befehle seit dem Programmstart bzw. dem letzten .org entspricht. Kann man direkt aus dem Quelltext berechnen. Da fuscht kein Linker dazwischen. MfG Spess
hey danke für die schnelle antwort =) also das programm ist RIDE, doch wo finde ich den opcode? hab nun ein paar datenblätter durchgeschaut und nichts hierzu gefunden. der chip ist ein atmel at89c5131a. Wie löse ich die FBh in eine sprungweite auf? ist es richtig sich bei der sprungweite hierbei zu orientieren? ------------------------------------------------------------------- LOC OBJ LINE SOURCE 1 INCLUDE AT89C5131.INC 243 244 CODE AT 0 245 246 LOOP: 0000 8590A0 247 MOV P2,P1; 248 249 0003 80FB 250 SJMP LOOP 251 252 END ----------------------------------------------------------------------- wenn ich es richtig verstanden habe sagt 80FB aus: 80h = sprungbefehl FBh = soweit muss er hochspringen allerdings ist doch FBh schon sehr naha an FFh, d.h. wird das zu einem drei byte befehl wenn er weiter springen muss? zb 80FF0A ? hoffe die fragen sind nicht zu verwirrend formuliert. :)
peter peter schrieb: > Wie löse ich die FBh in eine sprungweite auf? FBh ist die Sprungweite in Zweierkomplementdarstellung.
Hi
>FBh = soweit muss er hochspringen
FBh ist aber in dem Fall eine negative Zahl (-5).
mfG Spess
peter peter schrieb: > wenn ich es richtig verstanden habe sagt 80FB aus: > 80h = sprungbefehl > FBh = soweit muss er hochspringen Genau > allerdings ist doch FBh schon sehr naha an FFh, d.h. wird das zu einem > drei byte befehl wenn er weiter springen muss? Nein. Befehle haben EIN fixes Format. Das ganze muss ja einfach sein, weil es schnell gehen muss. Befehlsdecodierung für einen 8051 darf nicht lange dauern Dir fehlt aber noch etwas anderes. Nämlich das FBh eine neagtive Zahl ist. D.h. der Sprung geht zurück, in Richtung kleinere Adresse, Das Stichwort dazu ist: 2-er Komplement Arithmetik. Lies dir hier mal diesen Hauptpunkt durch http://www.mikrocontroller.net/articles/AVR-Tutorial:_Arithmetik8#8-Bit_Arithmetik_mit_Ber.C3.BCcksichtigung_eines_Vorzeichens Dein 8051 fasst die Sprungdistanz nämlich als vorzeichenbehaftete Zahl auf, die er zum momentanen Inhalt des PC (Programm Counter = sagt welcher Befehl als nächstes ausgeführt wird) dazuzählt. Und wenn diese Sprungdistanz negativ ist, dann geht es eben in der Abfolge der Befehle zurück und der nächste Befehl der ausgeführt wird, liegt weiter vorne. PS: das S in SJMP hat eine Bedeutung. Es steht für 'Small', also klein. Was könnte es wohl damit auf sich haben?
DANKE =) Habs verstadnen :-) Vielen dank für eure zahlreiche hilfe :-) und vorallem die schnelle ;-) tolles forum werde es weiterempfehlen.
peter peter schrieb: > wenn ich es richtig verstanden habe sagt 80FB aus: > 80h = sprungbefehl > FBh = soweit muss er hochspringen > allerdings ist doch FBh schon sehr naha an FFh, d.h. wird das zu einem > drei byte befehl wenn er weiter springen muss? > zb 80FF0A ? Nein. Wie schon gesagt wurde ist die Sprungweite im 8 Bit Zweierkomplement, FB ist -5. Nach dem Lesen des Sprungbefehls steht der Programcounter auf 5 und landet dann durch den Sprung um -5 wieder auf 0, und das ist gleichbedeutend mit dem Schleifenanfang. @K H Das s steht übrigens für short im Gegensatz zu l für long.
okay, habs durchgerechnet und .... ich komm ned drauf weis ned warscheinlich liegts an mir ^^ also das ist mal das beispiel (funktion sinnlos, ned beachten, nur zum rechnen) ------------------------------------------------------------------- LOC OBJ LINE SOURCE 1 INCLUDE AT89C5131.INC 243 244 CODE AT 0 245 246 LOOP_1: 247 0000 D290 248 SETB P1.0; 0002 C290 249 CLR P1.0 250 251 LOOP_2: 252 0004 D2A0 253 SETB P2.0; 0006 C2A0 254 CLR P2.0; 255 256 LOOP_3: 257 0008 D2A0 258 SETB P2.0; 000A C2A0 259 CLR P2.0; 260 261 LOOP_4: 262 000C D2A0 263 SETB P2.0; 000E C2A0 264 CLR P2.0; 265 0010 80FA 266 SJMP LOOP_4 267 0012 80F4 268 SJMP LOOP_3 269 0014 80EE 270 SJMP LOOP_2 271 0016 80E8 272 SJMP LOOP_1 273 274 END ----------------------------------------------------------------------- okay von Sprungwert loop_1 zum sjmp sinds 16h (22d) oder -26 Line E8h - -24d loop_2 zum sjmp sinds 10h (16d) oder -19 Line EEh - -18d loop_3 zum sjmp sinds 0Ah (10d) oder -12 Line F4h - -12d loop_4 zum sjmp sinds 06h (06d) oder -05 Line FAh - -06d wenn ich es hochzähle passt es nur bei loop_3 sonst nicht? wo liegt mein fehler??? danke schonmal ;)
Hi >wenn ich es hochzähle passt es nur bei loop_3 sonst nicht? wo liegt mein >fehler??? Erst mal sind die Zeilenzahlen uninteressant. Die Sprungweite wird in Bytes angegeben. In deinem Beispiel hat jeder Befehl 2 Bytes. Drehen wir mal das ganze um: Adresse 12H SJMP LOOP_4 12H-2Byte = 10H SETB P2.0; 10H-2Byte = 0EH CLR P2.0; 0EH-2Byte = 0CH LOOP_4: SETB P2.0; Und auf welcher Adresse steht der Befehl 'SETB P2.0;'? Bingo. Auf 0CH. Für solche Sachen ist es sinnvoller Label und zugehörigen Befehl in eine Zeile zu schreiben. Dann steht auch das Label an der richtigen Adresse. MfG Spess
HAHA =) ich habs kapiert und mal bei allen nachgerechnet und lande immer auf dem befehl =) besten danke :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.