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


von X. H. (shadow0815)


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?

von Dirk B. (sharandac)


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

von johnny.m (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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

von tester (Gast)


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?

von Mark S. (struberg)


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

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.