Inline-Assembler ändert Wert nur mit Serial.print

Solltest etwas mehr C++ lernen, damit das Denken in Assembler in Vergessenheit gerät.

Es gibt z.B. einen Unterschied zwischen Pointer und Referenz
void mirrorbits(byte &zeichenbyte); // Der Parameter ist hier eine Referenz, kein Pointer.

Natürlich kann man in C als Hardware-unabhängiger Sprache nicht mit Registern und Carry-Bits arbeiten und Befehle wie "relativen Sprung 'brne PC-3' " machen natürlich keinen Sinn.
(Heisst das Register EAX oder R23 ?)

byte mirrorbits(byte x) {
 byte b = 0;
 byte set = 0x80;
 while (x!=0){
   b |= (x &1)? set:0;
   x >>= 1;
   set >>= 1;
 }
 return b;
}

Wenn du es für besser hältst, kannst du auch mit Zeiger oder Referenz arbeiten und das Ergebnis in die gleiche Speicherstelle zurückschreiben. Klarer geht das aber ausserhalb

Eine solche Klacks-Funktion sollte selbstverständlich ohne globale Variable auskommen.

Wenn du das Spiegeln im gleichen Byte machen willst, schreibst du einfach

save = mirrorbits(save);