Z80-Assembler: Beispiel zum Spiegeln des Registers HL?

Antwort vom

**Ja: „HL spiegeln“ bedeutet beim Z80 meist, die Bitreihenfolge in H und L umzudrehen und zusätzlich die Bytes zu tauschen. Aus `HL = hhhhhhhh llllllll` wird dann `HL = reverse_bits(L) : reverse_bits(H)`.** ## Beispielprogramm Wenn du ein 16-Bit-Wort in `HL` komplett spiegeln willst, ist der einfachste Weg: beide Bytes einzeln bitweise spiegeln und danach vertauschen. ```asm ; Z80: 16 Bit in HL spiegeln ; Beispiel: ; HL = 1234h ; 12h -> 48h (00010010 -> 01001000) ; 34h -> 2Ch (00110100 -> 00101100) ; Ergebnis: HL = 2C48h ld a,h call REV8 ld b,a ld a,l call REV8 ld h,a ld l,b ret ; ------------------------------------ ; REV8 ; Spiegelt die 8 Bits in A ; Eingang: A ; Ausgang: A = bitgespiegelt ; Zerstört: B, C ; ------------------------------------ REV8: ld b,8 ld c,0 REV8_LOOP: rr a rl c djnz REV8_LOOP ld a,c ret ``` ## Warum das so funktioniert `rr a` schiebt in jeder Runde das niederwertigste Bit von `A` nach Carry. `rl c` übernimmt dieses Carry-Bit wieder in `C`, aber auf der anderen Seite. Nach 8 Durchläufen stehen die Bits deshalb genau umgekehrt in `C`. Der wichtige Punkt: Für ein **komplett gespiegeltes 16-Bit-Register** reicht es nicht, nur `H` und `L` intern zu spiegeln. Die Bytes müssen danach auch ihre Position tauschen. ## Falls nur die Bytes vertauscht werden sollen Manchmal ist mit „spiegeln“ nur gemeint, `H` und `L` zu tauschen, nicht die Bits: ```asm ld a,h ld h,l ld l,a ``` ## Wichtiger Unterschied - **Byte-Tausch:** `1234h -> 3412h` - **Bitspiegelung je Byte plus Byte-Tausch:** `1234h -> 2C48h` - **Nur Bitspiegelung innerhalb der Bytes ohne Tausch:** `1234h -> 482Ch` Der entscheidende Unterschied ist also: Erst wenn du **Bits und Byte-Reihenfolge** umdrehst, ist das 16-Bit-Wort wirklich vollständig gespiegelt.

Kategorie: Technik Tags: Z80 Assembler Register