Naja, man bekommt auch eine ISR in C durchaus flink, aber lassen wir
das.
> .global SIG_OUTPUT_COMPARE1B:
Das wolltest Du sicher in zwei Zeilen aufteilen, eine mit dem .global,
eine mit dem Doppelpunkt für den Label -- sonst nimmt es der Assembler
nicht.
> In dem ASM File möchte ich in der ISR die globale C Variabel von
> oben ("unsigned char buffer[1024]") verwenden.
Ja, das .global hast Du ja schon gefunden, da ist doch der Weg bis zum
.extern gar nicht mehr weit? Die Typinformation und Größe des Arrays
ist natürlich für den Assembler bedeutungslos, die mußt Du als
Programmierer ja einhalten. .extern ist übrigens eine Art NOP: der
Assembler nimmt alle Namen, die auftauchen und ihm nicht irgendwoher
bekannt sind, als `global undefined' an, so daß sie der Linker
auflößen muß. .extern dokumentiert aber, daß man sich nicht einfach
irgendwas ausgedacht hat als Programmierer, sondern daß es die
Definition dieses Objekts irgendwo außerhalb gibt.
> ldi r16, high(buffer)
Fast.
ldi r16, lo8(buffer)
ldi r17, hi8(buffer)
Leider sind diese beiden Operatoren nicht dokumentiert. :-( (Wie auch
alle anderen Erweiterungen im Assembler, die für den AVR gemacht
worden sind.)
Der einfachste Weg ist immer noch, sich den vom Compiler generierten
Code direkt anzusehen (Quelldatei foo.c: "make foo.s", dann foo.s
ansehen), da lernt man die paar zusätzlichen Operatoren recht einfach.