Forum: Mikrocontroller und Digitale Elektronik Mega8 init code


von Markus O. (oer)


Lesenswert?

Hallo!

ich schreibe gerade einen Emulator fuer den ATMega8 und dabei ist mir 
aufgefallen, dass es nicht benutzte Zeile in der Initialisierungsphase 
gibt. Nach Disassemblierung des Programms steht vor der main() Methode 
eigentlich fast immer folgendes:
1
00000000:   C012        RJMP    PC+0x0013        Relative jump
2
+00000001:   C02C        RJMP    PC+0x002D        Relative jump
3
+00000002:   C02B        RJMP    PC+0x002C        Relative jump
4
+00000003:   C02A        RJMP    PC+0x002B        Relative jump
5
+00000004:   C029        RJMP    PC+0x002A        Relative jump
6
+00000005:   C028        RJMP    PC+0x0029        Relative jump
7
+00000006:   C027        RJMP    PC+0x0028        Relative jump
8
+00000007:   C026        RJMP    PC+0x0027        Relative jump
9
+00000008:   C025        RJMP    PC+0x0026        Relative jump
10
+00000009:   C024        RJMP    PC+0x0025        Relative jump
11
+0000000A:   C023        RJMP    PC+0x0024        Relative jump
12
+0000000B:   C022        RJMP    PC+0x0023        Relative jump
13
+0000000C:   C021        RJMP    PC+0x0022        Relative jump
14
+0000000D:   C020        RJMP    PC+0x0021        Relative jump
15
+0000000E:   C01F        RJMP    PC+0x0020        Relative jump
16
+0000000F:   C01E        RJMP    PC+0x001F        Relative jump
17
+00000010:   C01D        RJMP    PC+0x001E        Relative jump
18
+00000011:   C01C        RJMP    PC+0x001D        Relative jump
19
+00000012:   C01B        RJMP    PC+0x001C        Relative jump
20
+00000013:   2411        CLR     R1               Clear Register
21
+00000014:   BE1F        OUT     0x3F,R1          Out to I/O location
22
+00000015:   E5CF        LDI     R28,0x5F         Load immediate
23
+00000016:   E0D4        LDI     R29,0x04         Load immediate
24
+00000017:   BFDE        OUT     0x3E,R29         Out to I/O location
25
+00000018:   BFCD        OUT     0x3D,R28         Out to I/O location
26
+00000019:   E010        LDI     R17,0x00         Load immediate
27
+0000001A:   E6A0        LDI     R26,0x60         Load immediate
28
+0000001B:   E0B0        LDI     R27,0x00         Load immediate
29
+0000001C:   E7E0        LDI     R30,0x70         Load immediate
30
+0000001D:   E0F0        LDI     R31,0x00         Load immediate
31
+0000001E:   C002        RJMP    PC+0x0003        Relative jump
32
+0000001F:   9005        LPM     R0,Z+            Load program memory and postincrement
33
+00000020:   920D        ST      X+,R0            Store indirect and postincrement
34
+00000021:   36A0        CPI     R26,0x60         Compare with immediate
35
+00000022:   07B1        CPC     R27,R17          Compare with carry
36
+00000023:   F7D9        BRNE    PC-0x04          Branch if not equal
37
+00000024:   E010        LDI     R17,0x00         Load immediate
38
+00000025:   E6A0        LDI     R26,0x60         Load immediate
39
+00000026:   E0B0        LDI     R27,0x00         Load immediate
40
+00000027:   C001        RJMP    PC+0x0002        Relative jump
41
+00000028:   921D        ST      X+,R1            Store indirect and postincrement
42
+00000029:   36A0        CPI     R26,0x60         Compare with immediate
43
+0000002A:   07B1        CPC     R27,R17          Compare with carry
44
+0000002B:   F7E1        BRNE    PC-0x03          Branch if not equal
45
+0000002C:   D002        RCALL   PC+0x0003        Relative call subroutine
46
+0000002D:   C008        RJMP    PC+0x0009        Relative jump
47
+0000002E:   CFD1        RJMP    PC-0x002E        Relative jump
48
4:        int main(){

Das der Stackpointer initialisiert wird ist ja noch ok, aber was machen 
die Zeilen 001E - 0023 ? Zu Adresse 001F wird meiner Ansicht nie 
gesprungen und warum sollte da ein Wert aus dem Program Memory geladen 
werden?

Kann mich da jemand erleuchten?

Vielen Dank und Viele Gruesse
  Markus

von Benedikt K. (benedikt)


Lesenswert?

Da werden die globalen Variablen initialisiert.

von Markus O. (oer)


Lesenswert?

Benedikt K. wrote:
> Da werden die globalen Variablen initialisiert.

hmm, welche denn? Ich kann nur an Adresse 17 und 18 den Stackpointer 
sehen.

Mir gehts auch eher darum, warum der Compiler Coder erzeugt, der nie 
ausgefuehrt wird? R17 und R27 werden jeweils auf 0 gesetzt, also kann 
nach dem Vergleich in 0022 nie nach 001F gesprungen werden...

glaube ich zumindest :)

von Benedikt K. (benedikt)


Lesenswert?

Bau mal globale Variablen in das Programm ein, die irgendeinen Wert 
ungleich 0 haben, dann müsste hier ein anderer Wert stehen. Der Code ist 
halt immer da, egal ob er gebraucht wird oder nicht.

von spess53 (Gast)


Lesenswert?

Hi

Vielleicht solltest erstmal relative Sprünge implementieren und die 
eintsprechenden Labels generieren.

MfG Spess

von Markus O. (oer)


Lesenswert?

Benedikt K. wrote:
> Bau mal globale Variablen in das Programm ein, die irgendeinen Wert
> ungleich 0 haben, dann müsste hier ein anderer Wert stehen. Der Code ist
> halt immer da, egal ob er gebraucht wird oder nicht.

Ui super! Jetzt wird das alles auch ausgefuehrt :)

Vielen Dank!
  Markus

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.