home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 12 / ami041.txt < prev    next >
Text File  |  1997-04-07  |  9KB  |  289 lines

  1.  
  2. ----------------Uwaga! Proszë zîoûyê dwuszpaltowo--------------------
  3.  
  4. Asembler (cz. 2.)
  5. -----------------
  6.  
  7. PIERWSZE KROKI 
  8.  
  9. <txt>
  10. -- No, no... kurs asemblera. A moûe by tak lepiej strzeliê sobie
  11. CZARNEGO LESZKA?
  12.  
  13. -- Co? W twoim wieku?
  14.  
  15. -- Po ostatniej lekcji sië zaîamaîem -- chyba sië tego nie nauczë.
  16.  
  17. -- Spoko, kolego. Rozkazy asemblera wcale nie sâ takie trudne.
  18.  
  19. -- Coooo?? Rozkazy??? To nie wystarczy mieê ASM-One'a?
  20.  
  21. -- Siadaj, stary, i nie marudú, ja Cië wszystkiego nauczë...
  22.  
  23. Minëîy dwa impulsy elektryczne. Na ekranie monitora pojawiî sië
  24. ASM-One. Dwa palce energicznie wystukaîy kilka poleceï. Jako
  25. ostatni naciôniëty zostaî klawisz [Esc].
  26.  
  27. -- No to jesteômy w edytorze. Teraz napiszë kod úródîowy. I
  28. ûadnych pytaï, dopóki nie skoïczë. Dopiero wtedy na wszystko
  29. odpowiem.
  30.  
  31. <l>
  32.     move.l    #'abcd',d0
  33.  
  34.     move.l    1234,d1
  35.  
  36.     lea    Tekst,a1
  37.  
  38.     move.l    Tekst,d5
  39.  
  40.     rts
  41.  
  42. Tekst:    dc.b    'To jest tekst napisany przeze mnie',0
  43.  
  44. <txt>
  45. -- To dla mnie za trudne. Rezygnujë z kursu.
  46.  
  47. -- Nie gadaj! Zaraz wszystko zrozumiesz. Jedziemy od poczâtku.
  48. Popatrz na pierwszâ linië programu. Zaczyna sië kilkoma spacjami,
  49. gdyû...
  50.  
  51. -- Tego sië uczyîem juû miesiâc temu (kaûdy rozkaz musi byê
  52. poprzedzony co najmniej jednâ spacjâ lub tabulatorem), ale co
  53. dalej?
  54.  
  55. -- Dalej znajduje sië rozkaz.
  56.  
  57. -- A zatem "move.l  #'abcd',C0" to jest rozkaz?
  58.  
  59. -- Nie! Rozkaz moûe sië skîadaê tylko z jednego wyrazu.
  60.  
  61. -- Czy w takim razie rozkazem jest 'move.l'?
  62.  
  63. -- Prawie, nazwy rozkazu czyta sië tylko do kropki. Pierwszym
  64. rozkazem jest "MOVE".
  65.  
  66. -- Co zatem oznacza: '.L  #'abcd',d0'?
  67.  
  68. -- Po kolei. Najpierw Ci wyjaônië, co oznacza '.L' Wiëkszoôê
  69. rozkazów ma rozszerzenie .b, .w lub .l. Litera oznacza, ile
  70. danych ma zostaê wziëtych pod uwagë. b (ang. byte) oznacza bajt,
  71. a odpowiada to jednemu znakowi w tekôcie...
  72.  
  73. -- Nie rozumiem.
  74.  
  75. -- No... Kaûdy znak (litera, spacja, liczba, tabulator itd.) to
  76. jest jeden bajt.
  77.  
  78. -- Czy w takim razie trzy litery (np. abc) to trzy bajty?
  79.  
  80. -- Oczywiôcie. Ale kontynuujmy. Jak juû powiedziaîem: b (w
  81. rozszerzeniu rozkazu) oznacza bajt, w (ang. word) -- sîowo, czyli
  82. dwa bajty (dwa znaki w tekôcie).
  83.  
  84. -- W takim razie szeôê znaków (np. abc2D#) to 6 bajtów, ale 3
  85. sîowa?
  86.  
  87. -- Tak. Natomiast litera l (ang. long word) oznacza jedno dîugie
  88. sîowo (odpowiada to dwóm sîowom, czyli czterem bajtom).
  89.  
  90. -- Zatem osiem znaków (np. abcdefgm) to 8 bajtów, 4 sîowa, ale 2 
  91. dîugie sîowa.
  92.  
  93. -- Fenomenalnie. Jednak wróêmy do naszego programu. Rozkaz move
  94. dziaîa podobnie, jak DOS-owy rozkaz copy -- kopiuje dane z
  95. jednego miejsca w drugie.
  96.  
  97. -- A zatem: move.b przeôle tylko jeden bajt, move.w jedno sîowo
  98. (czyli 2 bajty), a move.l -- jedno dîugie sîowo (4 bajty).
  99.  
  100. -- Oczywiôcie... Po rozkazie move podane sâ dwa parametry,
  101. oddzielone przecinkiem. Jeûeli przed pierwszym z nich znajduje
  102. sië znak #, to oznacza to, ûe ten parametr to dana, którâ chcemy
  103. wysîaê.
  104.  
  105. -- Jak to, dana?
  106.  
  107. -- Jeôli napiszesz: "move.l #1234, ...", to znaczy, ûe wyôlesz
  108. liczbë 1234. Natomiast jeûeli nie ma ûadnego znaku, to pierwszy
  109. parametr oznacza miejsce, z którego dane majâ byê kopiowane.
  110. Drugi parametr, znajdujâcy sië bezpoôrednio po przecinku, oznacza
  111. miejsce, w które dane zostanâ przesîane. Polecenie move ma wiëc
  112. nastëpujâcâ postaê:
  113.  
  114. <l>    move.(b/w/l)    skâd/#dana,gdzie
  115.  
  116. <txt>Lepiej zrozumiesz to na przykîadzie:
  117.  
  118. <l>
  119.     move.b    #1,d0
  120.  
  121.     move.w    #'12',d1
  122.  
  123.     move.b    #45,d3
  124.  
  125.     move.b    45,d2
  126.  
  127. <txt>Zanalizujmy powoli pierwszâ linië. Na poczâtku znajduje sië
  128. kilka spacji (wiadomo, muszâ byê przed kaûdym rozkazem). Za nimi
  129. podany jest rozkaz move. Oznacza to, ûe bëdziemy gdzieô coô
  130. przesyîali. Rozkaz move ma rozszerzenie .b, a to znaczy, ûe
  131. przesyîany bëdzie tylko jeden bajt. Po poleceniu move widzimy
  132. krzyûyk. Wobec tego pierwszy parametr bëdzie danâ. Po prawej
  133. stronie krzyûyka znajduje sië liczba 1 -- przesyîana bëdzie
  134. liczba (bajt o wartoôci) 1. Drugi parametr wyjaônia, dokâd ta
  135. dana zostanie przesîana. W naszym wypadku liczba 1 skopiowana
  136. bëdzie do d0.
  137.  
  138. -- A co oznacza to d0?
  139.  
  140. -- Jest to tzw. rejestr. Twój procesor ma wiëcej takich
  141. rejestrów.
  142.  
  143. -- Wprowadzasz mi nowe pojëcia i nie tîumaczysz ich. Co to sâ
  144. rejestry?
  145.  
  146. -- Rejestry sâ to takie miejsca, w których moûesz coô
  147. przechowywaê (tak jak sië to robi w pudeîkach). W procesorze
  148. Amigi istniejâ dwa typy rejestrów:
  149.  
  150. 8 rejestrów danych (d0,d1,d2,d3,d4,d5,d6,d7) i
  151.  
  152. 8 rejestrów adresowych (a0,a1,a2,a3,a4,a5,a6,a7)
  153.  
  154. -- Czym jedne róûniâ sië od drugich?
  155.  
  156. -- Rejestry danych przechowujâ dane. Natomiast rejestry adresowe
  157. przechowujâ adresy miejsc, w których dane sië znajdujâ.
  158.  
  159. -- Nie rozumiem, o co tu chodzi.
  160.  
  161. -- Przypuôêmy, ûe masz na stole dwa pudeîka. Do jednego wîoûyîeô
  162. np. kartkë z numerem telefonu kolegi. Oznacza to, ûe to pudeîko
  163. jest rejestrem danych. Natomiast do drugiego wîoûyîeô kartkë z
  164. adresem tego kolegi. Jest to rejestr adresowy, z którego moûesz
  165. odczytaê, pod jakim adresem zostawiîeô danâ.
  166.  
  167. -- No dobra! Rozumiem, ûe mogë coô poûyczyê koledze, ale komu
  168. mogë "poûyczaê" dane w komputerze? Klawiaturze?
  169.  
  170. -- Nie, nie. Dane moûesz wysyîaê do pamiëci komputera.
  171.  
  172. -- Czy w takim razie kaûde miejsce w pamiëci ma swój adres?
  173.  
  174. -- Owszem.
  175.  
  176. -- A ile danych moûna zmieôciê pod jednym adresem?
  177.  
  178. -- Tylko jeden bajt.
  179.  
  180. -- Jak to? To co sië stanie, jeôli pod adres 42 wyôlë cztery bajty
  181. (np. 4 litery: abcd)?
  182.  
  183. -- Pierwsza litera bëdzie sië znajdowaê pod adresem 42, druga juû
  184. pod 43, trzecia pod 44 i ostatnia, czwarta, pod adresem 45.
  185.  
  186. -- A jaki jest pierwszy i ostatni adres pamiëci?
  187.  
  188. -- Pierwszym adresem jest adres 0. Natomiast ostatni zaleûy od
  189. iloôci pamiëci, w którâ wyposaûony jest komputer.
  190.  
  191. -- Dobrze, rozumiem juû. Powróêmy zatem do naszego przykîadu.
  192.  
  193. -- Bardzo chëtnie. Wiemy juû, ûe po wykonaniu piewszego rozkazu
  194. rejestr d0 bëdzie zawieraî liczbë 1. Przejdúmy wiëc do drugiej
  195. linii. Znajduje sië w niej rozkaz move. Ma on rozszerzenie .w. W
  196. takim razie przesyîane bëdzie jedno sîowo (dwa bajty). Spójrzmy
  197. na pierwszy parametr. Znajduje sië przed nim krzyûyk, a zatem
  198. bëdzie on oznaczaî danâ. Na prawo od krzyûyka znajdujâ sië dwie
  199. litery, zapisane w apostrofach. (Tekst ZAWSZE musi znajdowaê sië w
  200. apostrofach lub cudzysîowach.) Dlatego teû te dwie litery zostanâ
  201. przesîane do rejestru danych d1. Popatrzmy na kolejnâ linië.
  202. Widzimy, ûe dana o wielkoôci jednego bajtu przesîana bëdzie do
  203. rejestru danych d3. Tâ danâ jest liczba 45. Po wykonaniu tego
  204. rozkazu rejestr d3 bëdzie przechowywaî liczbë 45.
  205.  
  206. -- Tak, ale dlaczego przesyîasz tylko jeden bajt (move.b), skoro
  207. do zapisania liczby 45 potrzeba 45 znaków?
  208.  
  209. -- Nie myl liczb ze znakami.
  210.  
  211. -- Mylë, bo nie powiedziaîeô mi, czym sië od siebie róûniâ?
  212.  
  213. -- Kaûdy znak ma odpowiadajâcâ mu liczbë (tak zwane kody ASCII).
  214. Kody te sâ z zakresu od 0 do 255. Na przykîad 'A' ma 65; 'a' ma
  215. 97; '1' ma 49 itd. Polskie litery na Amidze w standardzie AmigaPL
  216. majâ tak dobrane kody ASCII, aby nie wejôê na juû istniejâce
  217. znaki. Na przykîad litera 'â' ma kod 226. Dla asemblera nie ma
  218. znaczenia, w jaki sposób przeôlesz mu znak.
  219.  
  220. Dlatego teû oba te rozkazy:
  221.  
  222. <l>
  223.     move.b    #'a',d0
  224.  
  225.     move.b    #97,d0
  226.  
  227. <txt> dadzâ taki sam efekt. Zarówno w pierwszym, jak i w drugim
  228. wypadku do rejestru d0 przesîana zostanie liczba 97 ('a' ma kod
  229. 97).
  230.  
  231. -- Czyli zamiast 'a' mogë przesyîaê 97 i odwrotnie?
  232.  
  233. -- Owszem -- moûesz.
  234.  
  235. -- Skoro zawsze przesyîana jest tylko liczba, to jak komputer
  236. rozpoznaje, czy dana jest znakiem, czy liczbâ?
  237.  
  238. -- Komputer wszystko traktuje jako liczby. Nawet gdy wyôwietla tekst
  239. na ekranie, to sâdzi, ûe to tylko liczby.
  240.  
  241. -- Czy w takim razie liczba 9 i pojawiajâcy sië na ekranie znak 9
  242. to nie to samo?
  243.  
  244. -- Aleû skâd. Pojawiajâca sië na ekranie dziewiâtka to znak o
  245. kodzie 57, natomiast znak o kodzie 9 to tabulator. Kontynuujmy
  246. jednak czytanie naszego przykîadu. Jego ostatnia linia wyglâda
  247. nastëpujâco:
  248.  
  249. <l>    move.b    45,d2
  250.  
  251. <txt>Rozkaz move.b przesyîa jeden bajt (znak). Popatrzmy wiëc na
  252. pierwszy parametr. Nie ma tu krzyûyka, czyli oznacza on adres
  253. pamiëci, spod którego pobierana bëdzie dana. Tak wiëc znak, który
  254. znajduje sië pod adresem 45, zostanie przesîany do rejestru
  255. danych d2.
  256.  
  257. -- No tak! Teraz juû rozumiem. Moûemy wiëc powróciê do naszego
  258. gîównego programu. Czy mogë spróbowaê sam go rozszyfrowaê?
  259.  
  260. -- Aleû oczywiôcie!
  261.  
  262. -- Tak wiëc pierwsza linia move.l #'abcd',d0 oznacza, ûe
  263. przesyîamy danâ o rozmiarze 1 dîugiego sîowa. Tâ danâ sâ cztery
  264. litery 'abcd' i przesyîane sâ one do rejestru danych d0. Teraz
  265. rejestr d0 zawiera tekst 'abcd', ale w kodach ASCII. (Pamiëtam,
  266. ûe a ma 97, b -- 98, c -- 99 d -- 100 itd.). Mam tylko jedno
  267. pytanie. Co sië stanie, jeûeli zamiast 'd0' napiszë
  268. 'd0'?------------------?--------------
  269.  
  270. -- Nie ma to dla programu ûadnego znaczenia. Kody ASCII sâ tak
  271. ustawione, ûe pomiëdzy kodem duûej i maîej litery jest staîy
  272. odstëp (32). Amiga sama sobie ustawi potrzebnâ wartoôê, ale tylko
  273. w rejestrach i rozkazach asemblera. Jeôli wpiszesz tekst, duûe i
  274. maîe litery pozostanâ takimi, jak je wpisaîeô (ich kody bëdâ sië
  275. róûniê).
  276.  
  277. -- Teraz przechodzimy do drugiej linii move.l 1234,d1. Do
  278. rejestru danych d1 przesyîane jest jedno dîugie sîowo spod adresu
  279. 1234. W efekcie przesyîane sâ cztery bajty: pierwszy spod adresu
  280. 1234, drugi spod adresu 1235, trzeci 1236 i czwarty 1237. Kolejna
  281. linijka kodu úródîowego to: lea Tekst,a1. Oooo! To dla mnie nowy
  282. rozkaz.
  283.  
  284. -- Owszem. Ale o tym powiem dopiero za miesiâc.
  285.  
  286. -- Super! Zatem do nastëpnego numeru MA.
  287.  
  288. -- No, do nastëpnego.
  289.