+--------------+ L E K C J A 3 +--------------+ Macie oto przed sobâ trzeciâ lekcjë asseblera. Bez zbëdnych komentarzy przechodzimy do tego na co czekaliôcie tyle czasu... -------------------------------- Jak zwykle poznamy kilka nowych instrukcji: bra nazwa_etykiety Jest to bezwarunkowy skok. nazwa_etykiety - to po prostu nazwa etykiety, pod którâ ma zastaê wykonany skok. Instrukcja "bra" to coô jak "goto" w Basicu, czy teû w Amosie. -------------------------------- bsr nazwa_etykiety Z kolei ta instrukcja to coô jak "gosub" w Amosie. Skacze pod wskazanâ etykietë, ale jednoczeônie zapamiëtuje to miejsce. Gdy nastëpnie natrafi na instrukcjë "rts" to powróci pod wczeôniej zapamiëtane miejsce (czyli tuû za instrukcjë "bsr"). PRZYKÎAD: ;-------- S: bsr Procedurka move.b #10,d0 rts Clear_rejestry: moveq.l #0,d0 moveq.l #0,d1 rts ;-------- Czyli: Najpierw skacze pod etykietë "Clear_rejestry", a tam czyôci d0 i d1. Nastëpnie trafia na "rts" i wraca. Wykonuje "move.b #10,d0". Nastëpnie trafia na "rts" i wychodzi z programu! Prawda, ûe proste? -------------------------------- cmp.w #$f,d3 ; sprawdza czy w d3 znajduje sië 15 ($f). ; .w - operacja na sîowie, czyli jeôli w d3 ; bëdzie $0000000f to test bëdzie pozytywny, ; ale pozytywny bëdzie teû jeôli w d3 ; znajdzie sië $fab6000f!!! Wartoôê $fab6 ; jest bez znaczenia, gdyû testujemy ; tylko sîowo z rejestru d3! cmp.l #1,d2 ; sprawdza czy w d2 jest 1 bne NieMa ; Jeôli nie ma to skok do etykiety "NieMa" ... NieMa: ... -------------------------------- A teraz zajmiejmy sië trochë szerzej instrukcjâ Bxx. Jak juû wiemy (dla przypomnienia): Bra - bezwarunkowy skok Bsr - skok z powrotem po napotkaniu instrukcji rts Bne - skok gdy poprzednia operacja/test byî negatywny Beq - skok gdy poprzednia operacja/test byî pozytywny A teraz poznamy: ---------------- Blt Ble Bgt Bge No wiëc tak: ------------ Blt - skok jeôli mniej Ble - skok jeôli mniej lub tyle samo Bgt - skok jeôli wiëcej Bge - skok jeôli wiëcej lub tyle samo PRZYKÎADY: cmp.w #5,d0 ; sprawdza czy w d0 jest 5 blt JestMniej ; jeôli jest mniej to skok do "JestMniej" ... JestMniej: ... I w ten sam sposób dziaîajâ pozostaîe instrukcje. Tyle, ûe np. "ble" to skok jeôli jest mniej lub tyle samo, czyli w naszym przypadku skoczy gdy w d0 bëdzie mniej niû 5, lub dokîadnie 5. Mam nadziejë, ûe wszystko jasne. Aha, te wszystkie instrukcje wypadaîoby znaê, wiëc... zapamiëtajcie je. -------------------------------------------------------------------- ___ _/\_/---\_/\_ \/\_/\-/\_/\/ \___/ "Jak uûywaê tablic w assemblerze?" - z tym oto pytaniem zgîosiî sië do mnie pewien czîowiek. Otóû tîumaczë iû jest to proste. Powiedzmy, ûe mamy programik: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * section Prog,code_c ; dziëki temu nasz programik bëdzie sië ; alokowaî w wolnâ pamiëê chip! Start: moveq.l #0,d0 ; czyôê rejestr d0 Loop: addq #1,d0 ; do stanu rejestru d0 dodaj 1 ; Addq - szybkie dodawanie! cmp.w #10,d0 ; sprawdza czy w d0 jest 50 bne Loop1 ; jeôli nie to skok do Loop1 moveq.l #1,d0 ; przesyîa 1 do rejestru d0 Loop1: mulu.w #11,d0 ; mnoûy przez 11 d0 i tam zostawia teû wynik ; tejûe operacji. move.w d0,d1 ; przesyîa zawartoôê rejestru d0 do d1 ... tutaj program wykorzystujâcy d1 do czegoô... np. jako pozycja stawianego punktu. btst #6,$bfe001 ; test Lewego mychy bne Loop ; jeôli nie to skok do Loop rts ; wyjôcie * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Zamiast w ten sposób moûna by zrobiê to tak: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * section Prog,code_c Start: moveq.l #0,d0 ; czyôê rejestr d0 lea Tablica(pc),a0 Loop: add.w #1,d0 ; do stanu rejestru d0 dodaj 1 cmp.w #10,d0 ; sprawdza czy w d0 jest 10 bne Loop1 ; jeôli nie to skok do Loop1 moveq.l #1,d0 ; przesyîa 1 do rejestru d0 Loop1: move.w d0,d1 ; przesyîa zawartoôê rejestru d0 do d1 add.w d1,d1 ; mnoûy przez 2 rejestr d1 move.w (a0,d1.w),d1 ; przenosi danâ, która znajduje sië pod ; adresem wskazanym przez a0 + d1 to d1 ... tutaj program wykorzystujâcy d1 do czegoô... np. jako pozycja stawianego punktu. btst #6,$bfe001 ; test Lewego mychy bne Loop ; jeôli nie to skok do Loop rts ; wyjôcie Tablica: dc.w 11,22,33,44,55,66,77,88,99 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Jeôli ktoô z was tego nie zrozumiaî to... proponujë to czytaê i analizowaê krok po kroku, aû do upadîego. Aha, uûyîem tego: add.w d1,d1 ; mnoûy przez 2 rejestr d1 Oczywiôce dodajâc to samo, do tego samego, to tak jakbyômy to pomnoûyli przez 2! A instrukcja Add jest wykonywana przez komputer wielokrotnie szybciej niû mulu! Pamiëtajcie o tym, bo w przeciwnym razie wasze procedury bëdâ wolniejsze! Co do samej tablicy to oczywiôcie znajdujâ sië w niej przemnoûone juû wartoôci, których potrzebujemy! --------------------------------------------------------------------------- I to juû koniec lekcji numer 3. Mam nadziejë, iû dowiedzieliôcie sië z niej czegoô nowego (huh). Jako, ûe "lekcje" powstajâ doôê sporadycznie - nauka assemblera moûe potrwaê bardzo dîugo. Proponowaîbym wam zatem podjëcie nauki równieû "na wîasnâ rëkë". Nie znaczy to oczywiôcie, ûe ja przestajë pisaê "lekcje", powstawaê one bëdâ nadal gdyû chëtnych do nauki jak teû proôb o kontynuacjë jest sporo. Oki, spadam, a wy sië uczcie... Ranger of Ladybird Design