[ Pobierz całość w formacie PDF ]

Z tablicy wynika, że tę samą liczbę binarną mieszczącą
się w bajcie można odczytać na dwa sposoby: jako liczbę bez
znaku lub ze znakiem. W pierwszym przypadku zmieszczą się w
bajcie liczby od 0 do 255, w drugim natomiast - z zakresu od
-128 do +127. Różnica wartości powstaje przy tym dopiero powy-
żej 127, czyli od chwili, gdy najwyższy bit w bajcie przybie-
rze wartość 1. Toteż w liczbach ze znakiem bit ten ma charak-
ter bitu znaku: gdy ma wartość 0, liczba jest dodatnia, gdy 1
- ujemna. Po każdym działaniu arytmetycznym 6502 sprawdza war-
tość tego bitu w uzyskanym wyniku i identyczną przypisuje zna-
cznikowi N w rejestrze P, znacznikowi wyniku ujemnego. Gdy
posługujemy się arytmetyką ze znakiem, właśnie sprawdzenie
57
znacznika N pozwala ustalić, czy uzyskany wynik jest dodatni,
czy ujemny.
Powstaje jednak istotny problem: liczba ze znakiem jest
jakby krótsza o najwyższy bit i przy dodawaniu przeniesienie
powstaje o jeden bit niżej. Dlatego właśnie w rejestrze zna-
czników istnieje jeszcze jeden bit sygnalizujący takie prze-
niesienie, które nosi nazwę n a d m i a r u. Z angielskiego
słowa overflow wzięto dla nazwania tego znacznika drugą lite-
rę V, ponieważ O przypomina zero.
Znacznik V istotny jest tylko przy dodawaniu i odejmowa-
niu liczb ze znakiem. Spełnia wówczas ważną rolę w uzyskaniu
poprawnego wyniku, sygnalizując przeniesienie z bitu b6 do b7.
Dochodzimy do niezwykle istotnej zalety kodu uzupełnie-
niowego. Oto dzięki niemu operacje na takich samych liczbach
binarnych dają poprawne wyniki zarówno wtedy, gdy traktujemy
je jako liczby bez znaku, jak i wtedy, gdy interpretujemy je
jako liczby ze znakiem. Wymaga to jednak nieco odmiennego prze-
prowadzania obliczeń.
3.7 Przeniesienie, nadmiar i pożyczka.
Rozpatrzmy przykłady dodawania ujawniające specyficzne
właściwości kodu uzupełnieniowego. Wykonując dodawanie rozma-
itych liczb notować będziemy stany znaczników C i V oraz wy-
niki dodawania liczb bez znaku i ze znakiem, a w tym ostatnim
przypadku zbadamy również poprawność wyników.
Rozróżnić można trzy rodzaje sytuacji. Pierwsza polega na
dodawaniu stosunkowo niedużych liczb, przy czym wynik nie po-
woduje ani przeniesienia, ani nadmiaru:
00000111 5+7
+ 00001100 +12:
00010011 +19 C=0 V=0
00000010 +2
+ 11111100 -4_
11111110 -2 C=0 V=0
Jest to sytuacja, w której wynik jest poprawny identycz-
nie jak przy dodawaniu.
Sytuacja druga polega na dodawaniu stosunkowo niedużych
liczb, przy których powstaje przeniesienie do 9 bitu, ale nie
58
powstaje nadmiar.
00000100 +4
+ 11111110 -2_
1 00000010 +2 C=1 V=0
11111110 -2
+ 11111010 -4_
1 11111010 -6 C=1 V=0
Wynik jest poprawny pod warunkiem, że pominiemy przenie-
sienie.
Sytuacja trzecia polega na dodawaniu dwóch liczb dodat-
nich dających sumę większą niż 127, co powoduje nadmiar, a ta-
kże dwóch liczb ujemnych dających sumę mniejszą niż 128, co
również powoduje nadmiar.
01111111 +127
+ 00000001 +1_
10000000 -128 C=0 V=1 Wynik niepoprawny
10000001 -127
+ 11001110 -50_
1 01001111 +79 C=1 V=1 Wynik niepoprawny
Ustalmy na tej podstawie zasady postępowania przy dodawa-
niu liczb ze znakiem:
- inaczej postępujemy z bitem przeniesienia zawsze go ig-
norując:
- bit nadmiaru V sygnalizuje konieczność skorygowania wy-
niku. Jak się to czyni, rozpatrzymy pózniej przy omó-
wieniu znacznika V oraz wykorzystujących go rozkazów
rozgałęzień warunkowych BVC i BVS.
Pewna zawiłość działań na liczbach ze znakiem skłania wie-
lu programistów do ich unikania, gdy jest to możliwe, i posłu-
giwania się mniej "niebezpieczną" arytmetyką bez znaku. Np.
Mansfield [2] ocenia wręcz rozkazy BVC, BVS i CLV jako niep-
rzydatne.
wiczenia
x 1. Wykonajmy dodawanie poniższych par liczb binarnych
ze znakiem, podając obok wartości składników i sum w dec oraz
odpowiedzmy, które dodawania dają błędny wynik.
a/ 10100000 b/ 10000001 c/ 01111111
+01100001 +11111100 +00000100
59
2. Czy może wystąpić nadmiar przy dodawaniu 8-bitowej
liczby dodatniej i 8-bitowej ujemnej? Dlaczego?
3.8 Odejmowanie liczb 8 i 16-bitowych z pomocą SBC
Drugim obok ADC podstawowym rozkazem arytmetycznym 6502
jest rozkaz odejmowania SBC-(substract with borrow)- odejmij
z pożyczką . W rzeczywistości rozkaz ten zamienia odejmowanie
a-b na d o d a w a n i e a+(-b). Jak w każdym dodawaniu mo-
że tu zatem powstać przeniesienie i znacznik C będzie je nam
sygnalizował. Jednakże w kodzie uzupełnieniowym - b będzie
przedstawione jako 256-b. Warunek powstania przeniesienia moż-
na zatem zapisać jako
a+256-b > 256 czyli a-b> 0 czyli a>b.
Oto paradoks: przeniesienie powstanie wtedy, gdy nie ma
pożyczki i na odwrót. Ta właściwość arytmetyki komputerowej
sprawia, że aby uzyskać poprawny wynik odejmowania, należy
przed nim znacznik C u s t a w i ć, a nie jak przed ADC ska-
sować. Służy do tego rozkaz SEC set carry - ustaw znacznik
przeniesienia . Pozy tym programy są analogiczne jak przy do-
dawaniu, przedstawione w punkcie 5.3. Oto ich wersje:
ODJ1 CLD ODJ2 CLD ODJ CLD
LDA #31 LDA #8D SEC
SEC SEC LDA E
SBC #27 SBC #7B SBC F
STA B STA G STA G
LDA #A9 LDA E+1
SBC #29 SBC F+1
STA G+1 STA G+1
W przypadku odejmowania liczb dwubajtowych lub dłuższych
SEC należy, oczywiście, zastosować tylko w stosunku do pierw-
szego działania na najmniej znaczących bajtach. Potem, jak
przy dodawaniu, nastąpi automatyczna korekta wyniku o przenie-
sienie.
Rozkazy ADC i SBC są w 6502 jedynymi rozkazami wykonujący-
mi działania arytmetyczne na parach liczb. Nie ma stosowanych
60
w innych mikroprocesorach rozkazów dodawania i odejmowania
bez przeniesienia, co wymaga opisanej korekty znacznika C. Nie
rozporządza 6502 także rozkazami mnożenia i dzielenia, co jed-
nak nie zaskakuje, bowiem ze względu na ich złożoność stosowa-
ne są w procesorach większych i ... droższych.
Do mnożenia i dzielenia potrzebne są odrębne podprogramy.
Można jednak te działania uprościć, co pokażemy w punkcie 3.10.
wiczenia
1. Napiszmy w asemblerze programy dla liczb 8-bitowych
odpowiadające czynnościom opisanych w Basicu instrukcjami:
a/ Q=P-R x b/ Q=P+1-Q c/ K=L+1-M x d/ U=W+9-T
2. Jak wyrazić w Basicu poniższy program?
LDA N
SEC
SBC M+5
STA L
INC L
x 3. Co oznacza w tym programie M+5?
3.9 Zwiększenie i zmniejszenie o 1
Poznaliśmy wcześniej rozkaz INC. Zwiększa o 1 zawartość
komórki pamięci. Należy do grupy rozkazów o podobnym działaniu,
która obejmuje:
INC - zwiększenie o 1 zawartości komórki pamięci
INX - zwiększenie o 1 zawartości rejestru X
INY - zwiększenie o 1 zawartości rejestru Y
DEC - decrement memory by 1, zmniejszenie o 1 zawartości ko-
mórki pamięci
DEX - zmniejszenie o 1 zawartości rejestru X
DEY - zmniejszenie o 1 zawartości rejestru Y
Rozkazy te, wykonujące z pozoru drobną czynność, pozwa-
lają dzięki trybom adresowania indeksowanego łatwo tworzyć ko-
nstrukcje o cyklicznym działaniu analogiczne do tych, jakim w
Basicu służy:
FOR I=K TO L: ... dalsze instrukcje ...: NEXT I
61
Jest to znana praktycznie we wszystkich językach wysokie-
go poziomu pętla liczona oparta na sprawdzaniu wartości licz-
nika pętli, którym w podanym przykładzie jest zmienna I. Gdy
osiągnie ona wartość L, pętla zakończy działanie.
Drugim zastosowaniem indeksowania jest organizowanie dos-
tępu do struktur danych zwanych w Basicu i wielu innych języ-
kach tablicami. W Basicu po zadeklarowaniu rozmiaru tablicy,
np. z pomocą DIM A(10) otrzymujemy strukturę danych, w której
możemy rozmieścić potrzebne wartości. Dostęp do nich uzyskuje-
my z pomocą indeksowania zmiennej A, np. A(0), A(1), A(2)...
A(7) itd.
W celu odwzorowania pętli i tablic w asemblerze trzeba za
zastosować rozkazy, których jeszcze nie poznaliśmy, toteż od- [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • razem.keep.pl