Lies das Inline Assembler Cookbook:
https://www.nongnu.org/avr-libc/user-manual/inline_asm.html
Erstmal: __i__ und i sind zwei verschiedene Objekte.
Zweitens: Zugriff auf globale Variablen funktioniert in der Tat, indem
man sie einfach benennt. Allerdings gibt es eben bei dir keine globale
Variable namens __i__, daher spuckt am Ende der Linker (der Assembler
hatte an deiner Anweisung nichts auszusetzen!).
Drittens: globale Variablen für die Kommunikation sind so ziemlich die
schlechteste Wahl.
Viertens: wenn es nicht gerade zur eigenen Weiterbildung ist, vielleicht
fängst du ja lieber von vorn an zu erzählen, was du denn eigentlich mit
dem Inline Assembler bewerkstelligen willst. In 95 % der Fälle, in denen
Nutzer dieses schwere Geschütz auffahren, ist es eigentlich völlig
unnötig, da der Compiler das Ansinnen genauso gut erledigen könnte.
Fünftens: normalerweise würde man beim Zugriff auf eine lokale Variable
gar nicht erst diese aus dem Speicher lesen, sondern die constraints
(siehe Inline Asm Cookbook) passend setzen, sodass der Compiler sich
darum kümmert, den Wert 100 in einem Register bereitzustellen, aus dem
man ihn dann sofort weiterbenutzen kann. Die von dir gewünschte
Anweisung würde damit entfallen, du könntest sofort mit der nächsten in
deinem Assemblercode weiterschreiben, die von diesem Wert im
entsprechenden Register ausgeht. Auch das Register selbst wird dabei
nicht konkret benannt, sondern es wird nur dem Compiler mitgeteilt,
welche Art Register man braucht (beliebiges, aus der oberen Hälfte,
Zeiger …). Die konkrete Zuteilung macht dann wieder der Compiler. Auf
diese Weise steht man dem Compiler bei Optimieren nicht unnütz im Weg
herum.