Forum: Mikrocontroller und Digitale Elektronik Arbeitsweise des µControlers [Assambler]


von peter p. (atmel89c5131a)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von VCC (Gast)


Lesenswert?

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).

von Stilz (Gast)


Lesenswert?

Man kann den Assembler auch anweisen, ein ASM Listing zu generieren. 
Dann wird's einfacher.

von assemblista (Gast)


Lesenswert?

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.

von Mübin İ. (mbin_)


Lesenswert?

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.

von Stilz (Gast)


Lesenswert?

>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.

von Spess53 (Gast)


Lesenswert?

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

von peter p. (atmel89c5131a)


Lesenswert?

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.
:)

von µC-Bastler (Gast)


Lesenswert?

peter peter schrieb:
> Wie löse ich die FBh in eine sprungweite auf?

FBh ist die Sprungweite in Zweierkomplementdarstellung.

von Spess53 (Gast)


Lesenswert?

Hi

>FBh = soweit muss er hochspringen

FBh ist aber in dem Fall eine negative Zahl (-5).

mfG Spess

von Karl H. (kbuchegg)


Lesenswert?

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?

von peter p. (atmel89c5131a)


Lesenswert?

DANKE =)

Habs verstadnen :-)

Vielen dank für eure zahlreiche hilfe :-) und vorallem die schnelle ;-) 
tolles forum werde es weiterempfehlen.

von Dieter W. (dds5)


Lesenswert?

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.

von peter p. (atmel89c5131a)


Lesenswert?

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 ;)

von Spess53 (Gast)


Lesenswert?

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

von peter p. (atmel89c5131a)


Lesenswert?

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
Noch kein Account? Hier anmelden.