www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega8 init code


Autor: Markus O. (oer)
Datum:

Bewertung
0 lesenswert
nicht 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:
00000000:   C012        RJMP    PC+0x0013        Relative jump
+00000001:   C02C        RJMP    PC+0x002D        Relative jump
+00000002:   C02B        RJMP    PC+0x002C        Relative jump
+00000003:   C02A        RJMP    PC+0x002B        Relative jump
+00000004:   C029        RJMP    PC+0x002A        Relative jump
+00000005:   C028        RJMP    PC+0x0029        Relative jump
+00000006:   C027        RJMP    PC+0x0028        Relative jump
+00000007:   C026        RJMP    PC+0x0027        Relative jump
+00000008:   C025        RJMP    PC+0x0026        Relative jump
+00000009:   C024        RJMP    PC+0x0025        Relative jump
+0000000A:   C023        RJMP    PC+0x0024        Relative jump
+0000000B:   C022        RJMP    PC+0x0023        Relative jump
+0000000C:   C021        RJMP    PC+0x0022        Relative jump
+0000000D:   C020        RJMP    PC+0x0021        Relative jump
+0000000E:   C01F        RJMP    PC+0x0020        Relative jump
+0000000F:   C01E        RJMP    PC+0x001F        Relative jump
+00000010:   C01D        RJMP    PC+0x001E        Relative jump
+00000011:   C01C        RJMP    PC+0x001D        Relative jump
+00000012:   C01B        RJMP    PC+0x001C        Relative jump
+00000013:   2411        CLR     R1               Clear Register
+00000014:   BE1F        OUT     0x3F,R1          Out to I/O location
+00000015:   E5CF        LDI     R28,0x5F         Load immediate
+00000016:   E0D4        LDI     R29,0x04         Load immediate
+00000017:   BFDE        OUT     0x3E,R29         Out to I/O location
+00000018:   BFCD        OUT     0x3D,R28         Out to I/O location
+00000019:   E010        LDI     R17,0x00         Load immediate
+0000001A:   E6A0        LDI     R26,0x60         Load immediate
+0000001B:   E0B0        LDI     R27,0x00         Load immediate
+0000001C:   E7E0        LDI     R30,0x70         Load immediate
+0000001D:   E0F0        LDI     R31,0x00         Load immediate
+0000001E:   C002        RJMP    PC+0x0003        Relative jump
+0000001F:   9005        LPM     R0,Z+            Load program memory and postincrement
+00000020:   920D        ST      X+,R0            Store indirect and postincrement
+00000021:   36A0        CPI     R26,0x60         Compare with immediate
+00000022:   07B1        CPC     R27,R17          Compare with carry
+00000023:   F7D9        BRNE    PC-0x04          Branch if not equal
+00000024:   E010        LDI     R17,0x00         Load immediate
+00000025:   E6A0        LDI     R26,0x60         Load immediate
+00000026:   E0B0        LDI     R27,0x00         Load immediate
+00000027:   C001        RJMP    PC+0x0002        Relative jump
+00000028:   921D        ST      X+,R1            Store indirect and postincrement
+00000029:   36A0        CPI     R26,0x60         Compare with immediate
+0000002A:   07B1        CPC     R27,R17          Compare with carry
+0000002B:   F7E1        BRNE    PC-0x03          Branch if not equal
+0000002C:   D002        RCALL   PC+0x0003        Relative call subroutine
+0000002D:   C008        RJMP    PC+0x0009        Relative jump
+0000002E:   CFD1        RJMP    PC-0x002E        Relative jump
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

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da werden die globalen Variablen initialisiert.

Autor: Markus O. (oer)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Markus O. (oer)
Datum:

Bewertung
0 lesenswert
nicht 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

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.