Kurs Assemblera cz. 1
- TeBe / Madteam
WPROWADZENIE
Witajcie drogie dziatki, mam nieklamany zaszczyt zaprezentowac pierwsza czesc kursu assemblera CPU 6502. Zdecydowalem sie poprowadzic te lekcje pod wplywem tysiecy listów, które Dely ciagle otrzymuje, a w których to prosiliscie go o tego typu kurs. Tak, tak po tym kursie nikogo nie zdziwi Numen 2,3... , bowiem zdradze Wam jakich to tez instrukcji uzywal Konop, czy tez uzywa Fox.
Co mamy do dyspozycji ?
CPU 6502C 1.79MHz, 64KB-1MB RAM, QA, X-asm
64KB pamieci podstawowej RAM, dlaczego tylko 64, poniewaz tylko tyle potrafi zaadresowac 6502. Dostep do dodatkowej pamieci rozwiazano przez przelaczanie banków o pojemnosci 16KB. Czyli zeby dostac sie do pamieci rozszerzonej musimy sprowadzic ja do "parteru" czyli w obszar pamieci widzianej przez CPU.
Piszac o operacjach na pamieci bedziemy uzywac takich wyrazen jak bity, bajty, slowa.
BIT(BIT) - najmniejszy element pamieci, moze przyjac wartosc 0 lub 1
BYTE(BAJT) - 8 bitów to bajt, moze przyjac wartosc od 0-255
WORD(SLOWO) - 16 bitów czyli 2 bajty, moze przyjac wartosc od 0-65535
256 bajtów to STRONA (256B=PAGE)
1024 bajty to KILOBAJT (chociaz powinno byc KABAJT, kilo=1000g, 1024B=1KB)
1024 kilobajty to MEGABAJT (1024KB=1MB)
QA czyli Quick Assembler-Atari (J.Wisniewski) i X-Asm-PC (P.Fusik), to assemblery których uzywam, wiec wszystko co tu napisze bedzie ich dotyczylo.
O Assemblerze w czesci drugiej kursu.
SYSTEMY LICZBOWE
Na poczatek wprowadzenie w systemy liczbowe uzywane przez hiper-super-procesory 6502, jak i przez inne mniej znane, typu x86 ;)
Tak wiec systemów liczbowych mamy sporo, ale nas interesuja najbardziej dziesietne (to te o których uczyli w przedszkolu), dwójkowe i szestnastkowe. CPU6502 jest mikroprocesorem 8-bitowym, tzn ze uwielbia wartosci zapisane na 8iu bitach (bajty).
1. SYSTEM DWÓJKOWY (binarny)
Wystepuja tu tylko dwa stany 0 i 1, za pomoca róznych kombinacji zer i jedynek
zapiszemy wszystko. Komputer mysli wlasnie binarnie - jest prad 1, nie ma pradu
0.
1a. Konwersja Binarny -> Dziesietny.
Oto przykladowy BAJT
|1|0|0|0|1|0|0|1| 7 6 5 4 3 2 1 0 kolejnosc bitów (od prawej do lewej) ^ ^ najstarszy najmlodszy bit bit
Jak zapisac dziesietnie taki bajt ?
Skorzystac z Windowsowego Kalkulatora, albo
bit0*2^0+bit1*2^1+bit2*2^2+bit3*2^3+bit4*2^4+bit5*2^5+bit6*2^6+bit7*2^7
1*2^0 + 0*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 0*2^5 + 0*2^6 + 1*2^7 =
= 1 + 0 + 0 + 8 + 0 + 0 + 0 + 128 = 137
Czyli 10001001 to dziesietnie 137, ale jak zapisac binarnie 137, gdy nie znamy kombinacji 0 i 1.
1b. Konwersja Dziesietny -> Binarny.
Dzielimy przez 2, jesli mamy reszte z dzielenia zapisujemy 1, jesli dzieli sie
bez reszty zapisujemy 0.
137/2 | 68,5 mamy reszte wiec | 1 bit0 68/2 | 34 bez reszty czyli | 0 bit1 34/2 | 17 bez reszty czyli | 0 bit2 17/2 | 8,5 mamy reszte wiec | 1 bit3 8/2 | 4 bez reszty czyli | 0 bit4 4/2 | 2 bez reszty czyli | 0 bit5 2/2 | 1 bez reszty czyli | 0 bit6 1/2 | 0,5 mamy reszte wiec | 1 bit7
Mozna tez binarnie dodawac, mnozyc, dzielic, ale tego beda Was uczyc na studiach, za nas zrobi to Atarek. Osobiscie nie przepadam za recznymi operacjami na liczbach w systemie binarnym.
2. SYSTEM SZESTNASTKOWY (hexadecymalny)
Mamy do dyspozycji 16 róznych wartosci: 0123456789ABCDEF (wartosci od 10-15
zastapione zostaly literami).
starszy nibble ^ ^ ^ ^ |1|1|1|1|0|0|0|0| BINARNIE ^ ^ ^ ^ mlodszy nibble
F 0 HEXADECYMALNIE
240 DECYMALNIE
BIN HEX DEC | BIN HEX DEC 0000 0 0 | 1000 8 8 0001 1 1 | 1001 9 9 0010 2 2 | 1010 A 10 0011 3 3 | 1011 B 11 0100 4 4 | 1100 C 12 0101 5 5 | 1101 D 13 0110 6 6 | 1110 E 14 0111 7 7 | 1111 F 15
System ten przyjal sie ze wzgledu na swa przejrzystosc, nieprawdaz ze prosciutkie :)
3. REPREZENTACJA LICZB W ASSEMBLERZE czyli praktyka
Zapis wg Quick Assemblera i X-Asma (w innych assemblerach zapis powinien wygladac
podobnie)
znak % oznacza zapis binarny znak $ oznacza zapis hexadecymalny
np. %10110001 wartosc zapisana binarnie %01 %10110 $F2 wartosc zapisana w hex $e $8fab
W nastepnej czesci kursu zapoznamy sie juz blizej z assemblerem.