Wielobajtowe NOP-y: Różnice pomiędzy wersjami
Nie podano opisu zmian |
uzupełnienia |
||
| Linia 1: | Linia 1: | ||
Na stronie znajdują się metody pozwalające skrócić kod, często kosztem szybkości działania programu. | Na stronie znajdują się metody pozwalające skrócić kod, często kosztem szybkości działania programu. | ||
== Użycie rozkazu BIT do zamaskowania innego rozkazu == | |||
''' | Rozkaz ''BIT abs'' (trzybajtowy: $2C ll hh) nie modyfikuje zawartości rejestrów (z wyjątkiem rejestru statusu 6502), więc może być użyty jako legalny, trzybajtowy NOP do zamaskowania dowolnego rozkazu dwubajtowego. Na ogół maskowane są w ten sposób rozkazy ładujące ośmiobitowe stałe do rejestrów. Technikę tę stosuje się na ogół w podprogramach, w których kod główny spełnia różne funkcje w zależności od stałego parametry przekazanego w akumulatorze, a punkty wejścia wywoływane są za pośrednictwem jakiejś tablicy adresów. Zamiast: | ||
<pre> | |||
E0 LDA #$00 | |||
BEQ EXEC | |||
E1 LDA #$01 | |||
BNE EXEC | |||
EFF LDA #$FF | |||
EXEC ... | |||
</pre> | |||
piszemy: | |||
<pre> | |||
E0 LDA #$00 | |||
.BYTE $2C | |||
E1 LDA #$01 | |||
.BYTE $2C | |||
EFF LDA #$FF | |||
EXEC ... | |||
</pre> | |||
Dzięki pozbyciu się skoków w tym przykładzie zaoszczędzono dwa bajty. Z tego prostego triku nagminnie korzysta kod [[SpartaDOS X]]. | |||
Inne zastosowanie to załadowanie rejestru stałą w zależności od zmiennego parametru (gdy nie opłaca się zastosowanie tabeli). Przykład w pseudokodzie: ''IF zmienna=dana THEN A=dana1 ELSE A=dana2'' - badane mogą być inne relacje zmienna - dana. | |||
Zamiast: | |||
<pre> | <pre> | ||
LDA zmienna | |||
CMP dana | |||
BNE _1 | |||
LDA #dana1 | |||
BNE _2 ; BEQ | |||
_1 LDA #dana2 | _1 LDA #dana2 | ||
_2 ... | _2 ... | ||
</pre> | </pre> | ||
można zapisać | można zapisać tak: | ||
<pre> | <pre> | ||
LDA zmienna | |||
CMP dana | |||
BNE _1+1 | |||
LDA #dana1 | |||
_1 BIT $xxA9 ; $xx - dana2, $A9 kod rozkazu LDA | _1 BIT $xxA9 ; $xx - dana2, $A9 kod rozkazu LDA | ||
</pre> | </pre> | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] | ||
Wersja z 28 gru 2007, 00:00
Na stronie znajdują się metody pozwalające skrócić kod, często kosztem szybkości działania programu.
Użycie rozkazu BIT do zamaskowania innego rozkazu
Rozkaz BIT abs (trzybajtowy: $2C ll hh) nie modyfikuje zawartości rejestrów (z wyjątkiem rejestru statusu 6502), więc może być użyty jako legalny, trzybajtowy NOP do zamaskowania dowolnego rozkazu dwubajtowego. Na ogół maskowane są w ten sposób rozkazy ładujące ośmiobitowe stałe do rejestrów. Technikę tę stosuje się na ogół w podprogramach, w których kod główny spełnia różne funkcje w zależności od stałego parametry przekazanego w akumulatorze, a punkty wejścia wywoływane są za pośrednictwem jakiejś tablicy adresów. Zamiast:
E0 LDA #$00
BEQ EXEC
E1 LDA #$01
BNE EXEC
EFF LDA #$FF
EXEC ...
piszemy:
E0 LDA #$00
.BYTE $2C
E1 LDA #$01
.BYTE $2C
EFF LDA #$FF
EXEC ...
Dzięki pozbyciu się skoków w tym przykładzie zaoszczędzono dwa bajty. Z tego prostego triku nagminnie korzysta kod SpartaDOS X.
Inne zastosowanie to załadowanie rejestru stałą w zależności od zmiennego parametru (gdy nie opłaca się zastosowanie tabeli). Przykład w pseudokodzie: IF zmienna=dana THEN A=dana1 ELSE A=dana2 - badane mogą być inne relacje zmienna - dana.
Zamiast:
LDA zmienna
CMP dana
BNE _1
LDA #dana1
BNE _2 ; BEQ
_1 LDA #dana2
_2 ...
można zapisać tak:
LDA zmienna
CMP dana
BNE _1+1
LDA #dana1
_1 BIT $xxA9 ; $xx - dana2, $A9 kod rozkazu LDA