Inline-Assembler ändert Wert nur mit Serial.print

Ich würde mir das so erklären, dass der Compiler den Assembler-Code nicht anguckt, und daher "weiss", dass die Zeile

  mirrorwert = *zeichenbyte;

ohne den Serial.println Befehl (oder ohne volatile) völlig sinnlos ist.

Übrigens:

 void mirrorbits(byte *zeichenbyte) { ... }

hat nicht viel zu tun mit deiner Deklaration
void mirrorbits(byte &zeichenbyte);
(die auch ignoriert wird, weil sie nicht verwendet wird)

In

   byte save = x;
   mirrorbits(&save);

arbeitest du mit Zeigern, nicht mit Referenzen.

Mir persönlich würde eine Funktion wie

   byte m = mirrorbyte(x);

übrigens besser gefallen. ( Einfacher, klarer )


avr-objdump ist in deiner Arduino "toolchain" mit enthalten. Viel Spass.