Kann das sein? Variable in 0

Gast #410971
Lesenswert?

Hallo

Es geht um die erste Zeile im deassemblierten Code der angegebenen
C-Anweisung: Das L-Byte der Variable uint16_t gbc_pcnt soll also an
Adresse 0x0000 stehen? Kann das sein?!?

484:        if(gbc_pcnt < gbc.transmission_length){
+000005CD:   91200000    LDS     R18,0x0000       Load direct from data
space
+000005CF:   913007FF    LDS     R19,0x07FF       Load direct from data
space
+000005D1:   91800061    LDS     R24,0x0061       Load direct from data
space
+000005D3:   91900062    LDS     R25,0x0062       Load direct from data
space
+000005D5:   1782        CP      R24,R18          Compare
+000005D6:   0793        CPC     R25,R19          Compare with carry
+000005D7:   F498        BRCC    PC+0x14          Branch if carry
cleared


Gruss

Michael
Gast #410973
Lesenswert?

> LDS     R19,0x07FF
> kann ich allerdings ohne Angabe des Controllers nicht
interpretieren.

Jepp, das fiel mir soeben auch auf. Da nämlich die Adresse 0x07FF ganz
zuoberst in meinem Mega32 ist (der hat 2048 Bytes RAM, oberste Adresse
= 0x07FF). Keine Ahnung, wie der Compiler auf die hirnrissige Idee
kommt, die Variable ganz nach oben zu setzen. Das RAM ist zwar gut
gefüllt, aber kaum über 1500 Bytes.

Allerdings: Wenn ich ein grosses Array auskommentiere bzw. nur die
Schreibzugriffe darauf, dann funktioniert mein Programm. Die fragliche
Variable bleibt aber an gleicher Position 0x07FF.
#410975
Lesenswert?

Nein, 0x7FF ist nicht das Ende des RAMs, das liegt bei einem Mega32 erst
bei 0x85F, da er ja erst bei 0x60 anfängt.
0x7FF kann also gut ein Teil des Stacks sein. Das lowbyte holt er sich
dann aus dem tmp-Register, das highbyte aus dem ram.

Die zweite geladene Variable liegt hingegen ganz am Anfang des RAM, ich
würde also schätzen, es handelt sich hierbei um eine am Anfang
initialisierte Variable, die fest im Ram liegt und nicht auf dem Stack.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren