[ Pobierz całość w formacie PDF ]

instrukcjom Basicu zastępując numery linii 20 etykietami L20.
a/ IF F+G=H THEN 20 b/ IF T+1U THEN 20
x 2. Jaki błąd tkwi w programie:
LDA 1000
BIT #1
BNE L20
86
4.6.1 Znacznik C, rozkazy BCC i BCS
Dużą rolę znacznika przeniesienia C poznaliśmy rozpatru-
jąc rozkazy arytmetyczne, obrotu i przesunięcia bitów oraz
porównań. W operacjach arytmetycznych sygnalizuje on przenie-
sienie lub brak pożyczki. W przesunięciach i obrotach "prze-
chwytuje" wypadający bit. W porównaniach zachowuje się tak,
jak przy odejmowaniu.
Pamiętać trzeba, że C nie zmienia się pod wpływem żadne-
go rozkazu zwiększenia ani zmniejszenia, a także żadnego roz-
kazu przesłań poza PLP, który zastępując cały rejestr P war-
tością ze stosu może zmienić każdy ze znaczników. Na C dzia-
ła również rozkaz powrotu z przerwania RTI, który omówimy da-
lej.
Z pomocą rozkazów CLC i SEC programujący może skasować
lub ustawić C.
Tak więc znacznik C przybiera nową wartość odpowiadającą
wynikom wykonania rozkazów: ADC, ASL, CLC, CMP, CPX, CPY,LSR,PLP,
ROL, ROR, RTI, SBC, SEC.
A co będzie się dziać, gdy w programie przez pewien czas
nie zostanie zastosowany żaden z wymienionych rozkazów? Odpo-
wiedz odnosi się do w s z y s t k i c h znaczników: w takim
wypadku C, podobnie jak inne znaczniki, zachowywać będzie war-
tość, jaką otrzymał przy ostatniej dotyczącej go operacji.
Dlatego właśnie przed dodawaniem trzeba go skasować, a przed
odejmowaniem ustawić, by zapobiec błędowi, który może wywołać
"utajona" wartość odziedziczona kiedy przez znacznik.
BCC, branch on carry clear - odgałęzienie, gdy C=0 i
BCS, branch on carry set - odgałęzienie, gdy C=1 wykonują
skoki odpowiednio do stanu znacznika przeniesienia.
Z rozkazami tymi zetkniemy siÄ™ m.in. przy programach mno-
żenia i dzielenia. Pomocne są one również w korygowaniu moż-
liwych błędów dodawania i odejmowania liczb 1-bajtowych. Przy-
puśćmy, że nasz program do liczby dwubajtowej umieszczonej
pod adresami K i K+1 (mniej znaczÄ…cy bajt jako pierwszy) do-
daje liczbę jednobajtową L. Poprawność wyniku zapewni nastę-
pujący ciąg rozkazów:
87
LDA K MÅ‚odszy bajt K w akumulatorze
CLC Skasowanie znacznika
ADC L Dodajemy L
STA K Wynik wpisujemy ponownie do K
BCC DALEJ Jeżeli C=0, wynik jest już poprawny
INC K+1 Jeżeli C=1, starszy bajt zwiększamy o 1
DALEJ następny rozkaz
BCC zapewni przeskok nad rozkazem INC K+1, gdy K+L nie
przekroczy FF hex.
Analogicznie z pomocą symetrycznych rozkazów odejmujemy
L od dwubajtowego K:
LDA K
SEC
SBC L
STA K
BCS NAST
DEC K+1
NAST następny rozkaz lub koniec
Zwróćmy jednak uwagę na istotną różnicę. Gdy w drugim
programie K=L, znacznik C pozostanie ustawiony.
BCC i BCS pełnią w asemblerze i JM analogiczne funkcje,
jakie w Basicu można wyrazić z pomocą sprawdzenia warunku na
nierówność liczb.
SekwencjÄ™:
LDA G Dane spod G w A
CMP H Porównanie z danymi spod H
BCC SKOCZ Jeżeli dane > A, to idz pod adres SKOCZ
można traktować jako analogiczną do konstrukcji Basicu:
IF H > G THEN SKOCZ albo ogólniej: IF DANE > A THEN SKOCZ.
W przypadku sekwencji:
LDA G
CMP H
BCS SKOCZ
występuje drobna, lecz istotna różnica. Odpowiada ona konstru-
88
kcji Basicu:
IF DANE Tð A THEN SKOCZ
Aatwo bowiem zauważyć, że gdy H=G, także nastąpi skok.
Jeżeli zatem chcemy wykonać skok tylko wtedy, gdy H jest
mniejsze od G, możemy operację zmodyfikować następująco:
LDX G
INX
CPX H
BCS SKOCZ
wiczenia
x 1. Czy poprawna jest poniższa sekwencja?
BCC SKOK
SKOK następny rozkaz
4.8.2 Znacznik Z, rozkazy BNE i BEQ
Z jest znacznikiem wyniku zerowego, toteż przybiera war-
tość jakby odwrotnie do wyniku: jest kasowany, gdy powstała
wartość niezerowa, a ustawiany w przeciwnym wypadku.
Na znacznik Z wpływa znacznie więcej rozkazów niż na C,
w tym wszystkie, które zmieniają wartość C. Dodatkowo znacznik
wyniku zerowego sygnalizuje go przy większości przesłań
(oprócz przesłań na stos, do pamięci i TXS), a także porównań,
w tym bitowego BIT, zwiększeń i zmniejszeń.
Nie ma specjalnych rozkazów, które kasowałyby lub usta-
wiały znacznik Z. Aatwo jest to jednak osiągnąć. Np. LDA #0
spowoduje, że Z przybierze wartość 1.
Na stan znacznika wyniku zerowego wpływają następujące
rozkazy: ADC, AND, ASL, BIT, CMP, CPY, CPX, DEC, DEX, DEY,
EOR, INC, INX, INY, LDA, LDX, LDY, LSR, ORA, PLA, PLP, ROL,
ROR, RTI, SBC, TAX, TAY, TSX, TXA i TYA.
Na sprawdzaniu znacznika Z oparte sÄ…:
BNE - branch on not equal to 0, odgałęzienie, gdy wynik0.
BEQ - branch on equal to 0, odgałęzienie, gdy wynik=0.
W Basicu odpowiada to konstrukcjom:
89
IF DANEAKUMULATOR THEN SKOK BNE
IF DANE=AKUMULATOR THEN SKOK BEQ
Ponadto, jak już widzieliśmy, BNE pozwala łatwo skonstru-
ować pętlę liczoną analogiczną do konstrukcji Basicu:
FOR I=0 TO N: ciÄ…g instrukcji : NEXT I
FOR I=N TO 0 STEP -1: ciÄ…g instrukcji : NEXT I
Ogólną zasadą jest wykorzystanie w tym celu jednego z re-
jestrów indeksowych jako wskaznika pętli. Ponieważ osiągnięcie
przez ten wskaznik granicy 0 można wprost kontrolować rozkazem
BNE, natomiast osiągnięcie jakiejś wartości N wymaga porównywa-
nia z nią wskaznika po każdym wykonaniu cyklu, zdecydowanie
bardziej dogodny jest w JM odpowiednik drugiego rodzaju przed-
stawionej tu pętli. Wszędzie,gdzie można ją zastosować, trze-
ba to wykorzystać.
BNE i BEQ znajdujÄ… szerokie zastosowanie w programach. O-
to drobny przykład. Mamy w pamięci poczynając od adresu T tab-
licę znaków o długości D i chcemy odnalezć pierwsze wystąpie-
nie w niej znaku cudzysłowu, którego kod wynosi 22 hex. W tym
wypadku nie możemy badać tablicy od końca. Do kolejnych ele-
mentów tablicy uzyskamy dostęp z pomocą adresowania absolutne-
go indeksowanego.
LDX #0 Początkowa wartość indeksu zmiennej T
NAST LDA T,X Element tablicy w akumulatorze
CMP #22 Porównanie z kodem cudzysłowu
BEQ ZNAL Jeżeli znaleziono cudzysłów, przejście pod ZNAL
INX Zwiększenie indeksu zmiennej T
CPX #D Czy wskaznik nie przekroczył długości tablicy?
BNE NAST Jeżeli nie, badamy następny element
.END Komenda asemblera: koniec programu
ZNAL STX WYNIK Ostatni indeks zapisany w komórce WYNIK.
Program bada tablicę aż do adresu o 1 większego niż jej
długość. Jeżeli w komórce o adresie WYNIK znajdziemy liczbę
mniejszą lub równą D, będzie to wartość indeksu, pod którym w
tablicy znajduje się kod cudzysłowu, w przeciwnym wypadku
WYNIK=0 czyli cudzysłowu nie było. W programie użyliśmy dwóch
90
poznanych rozkazów odgałęzień. BEQ zapewniało przeskok do
przodu w przypadku znalezienia poszukiwanego znaku, BNE - pow-
tarzanie pętli do chwili,gdy cała tablica została zbadana. D
nie może być większe niż 254.
wiczenia
x 1. Czy można w przykładzie powyżej zastąpić BNE przez
BCS? Czy coÅ› siÄ™ przez to zmieni?
2. Czy można tak przebudować ten program, by bez zmiany
jego działania wyeliminować rozkaz CPX #D? (do sprawy wróci-
my).
4.6.3 Znacznik N, rozkazy BPL i BMI
Znacznik wyniku ujemnego N zajmuje w rejestrze znaczników
najwyższy bit, co zbieżne jest z faktem, że w liczbach ze zna-
kiem właśnie w tym bicie liczby 8-bitowej lub w najwyższym bi-
cie liczby 16-bitowej znajduje siÄ™ informacja, czy liczba jest
dodatnia, czy ujemna. W drugim wypadku bit znaku, jak zapewne
pamiętamy, przybiera wartość 1. Tak więc znacznik N ma po wy-
konanej operacji taką samą wartość, jak bit znaku w wyniku.
Niekiedy określa się go zresztą jako znacznik znaku (ang. sign
flag) i oznacza literą S, co jednak może być mylące, ponie-
waż jako S oznacza się również wskaznik stosu.
W większości wypadków znacznik N jest identyczny jak bit
b7 akumulatora. Dzięki temu można sprawdzić ten bit w akumula- [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • oralb.xlx.pl