mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ASM--->MaschinenCode Wieso aus rjmp .+6 -> 03c0 wird?


Autor: X. H. (shadow0815)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe die Darstellung von: "rjmp .+6" im Flash nicht?

Aus einer .lss-Datei:

78:  03 c0         rjmp  .+6        ; 0x80 <adc_getvalue+0x12>



D.h. also, die Darstellung von rjmp .+6 ergibt 03c0 im Prog.-Speicher.

Die Beschreibung im Instruction-Set von rjmp lautet:
rjmp k
16-Bit OP-Code: 1100 kkkk kkkk kkkk

0b1100=0xC    Hex C entspricht also rjmp.

Das C ist in 03c0 nicht an erster Stelle, sollte es aber lt. OP-Code 
sein.
Okay, kann ich ja, (warum auch immer) die Bytes tauschen, habe ich:
C003
Mein Problem ist, wo ist die 6?
Das  ".+6" soll heißen 6 im Zweierkomplement? (Oder wozu der Punkt?) - 
Ist ja positiv also ändert sich die zahl zu einer vorzeichenlosen nicht. 
Also würde ich C006 (ohne Drehung im Maschinen-Code) erwarten...

Was mach ich falsch?

Autor: Dirk Broßwick (sharandac)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich weis es zwar auch gerade nicht genau, aber der speicher für 
intruktionen ist im AVR wordweise organisiert, so werden aus 6 Byte 3 
Words. Kann aber auch sein das es falsch ist.

CA Dirk

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Intel-Hex wird das Low-Byte vor dem High-Byte abgelegt (also bei der 
niedrigeren Adresse).

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sollte dabei noch beachten, dass Atmels Assembler den Code in Worten 
rechnet, der GNU-Assembler aber in Bytes.

Autor: tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu beachten ist auch noch, dass beim Assembler der . bedeutet: die 
Adresse des aktuelle (RJMP)-Befehls, wogegen der Prozessor die Bytes vom 
nächsten Befehl aus zählt.

Das erklärt zwar den Unterschied zwischen 3 und 6 noch nicht ganz, aber 
sollte Dir troztden weiterhelfen, mit den obengenannten Posts den Code 
zu verstehen.

Ist der Code Ergebnis eines Compilers? Wenn ja, dann kann es auch sein, 
dass der Compiler bei einem bedingten Sprung die Bedingung umkehrt und 
andere Sprünge verwendet.

z.B.
brne label1
rjmp label2

wird zu
breq label2
rjmp label1

Wie schauen denn die umliegenden Befehle (und der Sourcecode) aus?

Autor: Mark Struberg (struberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
> ich weis es zwar auch gerade nicht genau, aber der speicher für
> intruktionen ist im AVR wordweise organisiert, so werden aus 6 Byte 3
> Words. Kann aber auch sein das es falsch ist

Nö, stimmt exakt.

Wenn Du Dich noch weiter für AVR assembler interessierst, dann kannst ja 
den von Jonas Diemer geschriebenen (und von mir partiell erweiterten) 
AVR simulator ansehen: http://sourceforge.net/projects/avrsimu/

Ist ein reines commandline tool (und dzt nur für ATtinys), aber im Code 
kann man viele Infos rauslesen.

LieGrü,
strub

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.