Informacje dodatkowe     Systemy liczenia


Adresy komórek pamięci i dane natychmiastowe można zapisywać w czterech systemach matematy-
cznych: dziesiętnym (Decimal), szesnastkowym (Hexadecimal), ósemkowym (Octal) lub dwójkowym
(Binary). Można również użyć ciągu znaków ASCII zapisanych w cudzysłowach. Każdy znak z ciągu,
zostanie zamieniony na odpowiadającą mu wartość binarną, np. znak "1" ma wartość $31, "aHa" =
$614861. Jeśli znaków będzie więcej niż wynika to z rozmiaru instrukcji, to wartość danej natychmia-
stowej, będzie ustalona przez 1/2/4 ostatnie znaki. Adres komórki pamięci, zostanie ustalony przez
2/4 ostatnie znaki ASCII z ciągu.

Poniższa tabela przedstawia, jakiego operatora należy użyć
do zapisania wartości w danym systemie matematycznym:

 
DEC
HEX
BIN
OCT
ASCII
Adres komórki pamięcibrak 
$
%
@
"..."
Dana natychmiastowa
#
#$
#%
#@
#"..."
Dopuszczalne cyfry/znaki 
0-9
0-9, A-F 0-1 0-7 TAB, " "-"~" 

Na przykład:

Aby zapisać adres komórki nr $41 (HEX), należy napisać:
65 (DEC), %1000001 (BIN), @101 (OCT) lub "A" (ASCII).

Aby zapisać danę natychmiastową o wartości #$5A (HEX), należy napisać:
#90 (DEC), #%1011010 (BIN), #@132 (OCT) lub #"Z" (ASCII).

Wartości adresów komórek pamięci i danych natychmiastowych można zapisywać ujemnie. Aby zapisać
ujemnie adres komórki pamięci, należy postawić minus przed operatorem danego systemu matematy-
cznego ($, %, @) lub bezpośrednio przed wartością dziesiętną, ciągiem znaków ASCII lub etykietą, ale
tylko jeśli została ona stworzona definicją (ETYKIETA=ADRES, ew. ETYKIETA=ETYKIETA2). Zwykłej
etykiety nie można zapisać ujemnie. Ujemną wartość danej natychmiastowej, uzyskuje się pisząc minus
między znakiem "#" i operatorem danego systemu matematycznego lub bezpośrednio przed wartością
dziesiętną, ciągiem znaków ASCII lub zdefiniowaną etykietą.

Wartość dodatnia/ujemna jest dodawana/odejmowana do/od wyzerowanego wirtualnego rejestru, który
jest tworzony przez kompilator. Jego rozmiar w przypadku danych natychmiastowych jest taki sam, jak
rozmiar instrukcji lub dyrektywy. Natomiast w przypadku adresów komórek pamięci, jego rozmiar wynosi
".W" lub ".L". Jeśli podana wartość adresu lub danej natychmiastowej jest większa, niż rozmiar wirtual-
nego rejestru, to jego wartość wyzeruje się (przepełnienie) i będzie liczona od zera. Przy kompilowaniu
kodu źródłowego, wartość wirtualnych rejestrów po obliczeniach jest wstawiana do programu wykony-
walnego. Na przykład:

DC.B -1, -2, -3 = DC.B $FF, $FE, $FD.
DC.W -1, -2, -3 = DC.W $FFFF, $FFFE, $FFFD.
DC.L -1, -2, -3 = DC.L $FFFFFFFF, $FFFFFFFE, $FFFFFFFD.

W wyniku użycia powyższych dyrektyw, w programie wykonywalnym
otrzyma się trzy bajty/słowa/długie słowa, o podanych wartościach.

CLR.b $-2 - zeruje komórkę pamięci o adresie $FFFFFFFE.
MOVE.w #-1,D0 - przenosi wartość $FFFF do rejestru D0.
TST.b -"R" - testuje komórkę pamięci o adresie $FFFFFFAE.

Zapis wartości ujemnych, w niektórych przypadkach jest krótszy od tradycyjnego.

Dane binarne również mogą być traktowane, jako wartości tylko
dodatnie (Unsigned) lub dodatnie i ujemne (Signed). Na przykład:

   
  DANE    UNSIGNED     SIGNED   
 B 
 Y
 T
 E
00       00
7F127        127
80128-128        
FF255-1
 W 
 O
 R
 D
0000     00
7FFF32767      32767
800032768-32768      
FFFF65535-1
 L 
 O
 N
 G
0000000000
7FFFFFFF21474836472147483647
800000002147483648-2147483648 
FFFFFFFF 4294967295 -1
Widać, że w systemie Signed, jeśli najstar-
szy bit danych jest zerem, to wartość jest
dodatnia (od najmniejszej do największej).
Natomiast, jeśli bit ten jest jedynką, to war-
tość jest ujemna (od największej do naj-
mniejszej).

Wszystkie instrukcje skoków i rozgałęzień,
zapisują długość skoku/rozgałęzienia do
przodu (+) lub do tyłu (-), w systemie Sig-
ned. Dotyczy to również wartości przemie-
szczeń i rejestrów indeksujących, zawar-
tych w argumentach instrukcji.

Instrukcje mnożenia i dzielenia mogą zwracać wyniki tych operacji, zarówno w systemie
Unsigned (instrukcje MULU i DIVU), jak i w systemie Signed (instrukcje MULS i DIVS).

Ponadto wartości adresów komórek pamięci i danych natychmiastowych, mogą być zpisane dowolnym
wyrażeniem matematycznym, z użyciem czterech podstawowych działań: "+" - dodawanie, "-" - odejmo-
wanie, "*" - mnożenie, "/" - dzielenie. Na zwykłych etykietach można przeprowadzać jedynie operacje
dodawania i odejmowania. Natomiast na etykietach zdefiniowanych można wykonywać wszystkie cztery
działania matematyczne. Na przykład:

CLR.b @10+"1"/%10-8*$A+56 - zeruje komórkę pamięci o adresie $00000100.
MOVE.l #"Z"/"-"*"!"+"0",D3 - przenosi wartość $00000072 do rejestru D3.