> .org OVF0addr
> in save_sreg, SREG
Das ist auf jeden Fall schon mal die Ursache für die Fehlermeldung! Der
Assembler fängt mit dem Assemblieren vorne an. Wenn er nicht durch ein
.org auf eine andere Idee gebracht wird, schaufelt er die Befehle in der
Reihenfolge, wie Du sie programmiert hast, in den Speicher. Also steht
an der Adresse 0x0000 am Anfang des Programmspeichers bei Dir
1 | ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse
|
Und so weiter... Dann ist der Assembler fast fertig, und plötzlich
taucht ein .org auf, das ihm sagt, schreibe die folgenden Befehle ab der
angegebenen Adresse. Der Assembler merkt aber: "An der angegebenen
Adresse steht schon was"! Also gibt er eine Fehlermeldung aus und bricht
ab.
Grundsätzlich:
Die Interrupt-Vektoren stehen am Anfang des Programmspeichers, und da
müssen auch die Sprungbefehle zu den Interrupt-Handlern hin (oder, wenn
wie in diesem Fall nur ein einziger Interrupt Handler vorhanden ist,
auch direkt der komplette Handler). An die Adresse 0 (Reset-Vektor, also
ganz an den Anfang) gehört dann aber ein Sprung an den eigentlichen
Programmanfang, wo dann auch die Stack-Initialisierung hinkommt.
Um das ganze Programm durchzusehen, hab ich jetzt keine Zeit (und bei
der Codewurst ohne jeglichen Kommentar im Hauptteil hätte das auch
keinen wirklichen Sinn). Kommentier das mal vernünftig. Aus
Assembler-Code kann man noch schlechter was rauslesen als aus
Hochsprachen-Code.