home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #7 / amigamamagazinepolishissue1998.iso / magazyn_amiga / 0896 / 048_asembler < prev    next >
Text File  |  1998-03-26  |  10KB  |  394 lines

  1. --------------Proszë zîoûyê dwuszpaltowo-------------------
  2.  
  3. PROGRAM SZYFRUJÂCY DANE
  4.  
  5. <a>Bartek Pampuch
  6.  
  7. <txt>Miesiâc temu napisaliômy program stanowiâcy "wstëp" do
  8. programu szyfrujâcego dane. Program ten pytaî uûytkownika o nazwë
  9. pliku oraz hasîo, a nastëpnie kopiowaî podany plik do pamiëci i
  10. zapisywaî go pod nazwâ "ram:plik". Hasîo natomiast zapisywane
  11. byîo w pliku "ram:haslo". Na koniec uruchamiany byî gîówny
  12. program kodujâcy "df0:code" (dzisiaj go napiszemy). Bëdzie on
  13. wykonywaî nastëpujâce czynnoôci:
  14.  
  15. 1) Wczytanie pliku ram:plik do pewnego bufora (u nas: DATA)
  16.  
  17. 2) Wczytanie pliku ram:haslo do pewnego bufora (u nas: HASLO)
  18.  
  19. 3) Kodowanie bufora DATA hasîem z bufora HASLO
  20.  
  21. 4) Zapisanie bufora DATA do pliku ram:plik
  22.  
  23. Zanim przyjrzysz sië kodowi úródîowemu, musisz poznaê zasadë
  24. dziaîania kilku nowych rozkazów.
  25.  
  26. Pierwszy to "TST.x REJESTR_DANYCH/(ADRESOWY)", gdzie x to B, W
  27. lub L. Rozkaz ten sprawdza, czy podany rejestr danych (lub dana
  28. znajdujâca sië pod okreôlonym adresem) jest pusty, czy coô
  29. zawiera. Jeûeli jest pusty (czyli jego zawartoôê to 0), to
  30. ustawiany jest znacznik Z (za chwilë wytîumaczë, jak të wiadomoôê
  31. wykorzystaê). W przeciwnym wypadku (jeôli coô zawiera), znacznik
  32. Z jest zerowany.
  33.  
  34. Moûemy z tego skorzystaê, uûywajâc innego rozkazu: "BEQ
  35. Etykieta", który jest tak zwanym rozkazem warunkowym. Sprawdza
  36. on, czy znacznik Z jest ustawiony. Jeûeli tak, to zostanie
  37. wykonany skok w miejsce programu, okreôlone przez Etykietë. W
  38. innym wypadku wykonywana jest instrukcja, znajdujâca sië
  39. bezpoôrednio za rozkazem BEQ:
  40.  
  41. <l>
  42.  
  43.     lea $80000,a0
  44.  
  45.     tst.l d0
  46.  
  47.     beq D0Pusty
  48.  
  49. D0Peîny:
  50.  
  51.     tst.l (a0)
  52.  
  53.     beq DanaPodA0Pelna
  54.  
  55.     jmp DanaPodA0Pusta
  56.  
  57. D0Pusty:
  58.  
  59.     tst.l (a0)
  60.  
  61.     beq DanaPodA0Pelna
  62.  
  63. DanaPodA0Pusta:
  64.  
  65.     ...
  66.  
  67. DanaPodA0Pelna:
  68.  
  69.     ...
  70.  
  71.  
  72. <txt>Powyûszy schemat obrazuje sposób dziaîania rozkazów TST
  73. oraz BEQ.
  74.  
  75. Przeciwieïstwem rozkazu BEQ jest rozkaz BNE. W wypadku tego
  76. rozkazu skok do Etykiety wykonywany jest, gdy znacznik Z jest
  77. wyzerowany.
  78.  
  79. <l>
  80.  
  81.     tst.l    d0
  82.  
  83.     bne    D0Pelny
  84.  
  85. D0Pusty:
  86.  
  87.     ...
  88.  
  89. D0Pelny:
  90.  
  91.     ...
  92.  
  93. <txt>Istnieje jeszcze kilka innych rozkazów warunkowych, ale
  94. powiemy o nich, kiedy bëdâ nam potrzebne.
  95.  
  96. Teraz natomiast zapoznam cië z nowym systemem liczbowym, zwanym
  97. systemem dwójkowym. W systemie tym, do zapisania liczb uûywa sië
  98. jedynie dwóch cyfr: jedynki oraz zera. W liczbach zapisanych w
  99. tym systemie cyfra najbardziej na prawo jest cyfrâ jednoôci,
  100. kolejna (na lewo) to cyfra dwójek, kolejna (na lewo) to cyfra
  101. czwórek, kolejna -- ósemek itd. (Dla porównania: w systemie
  102. dziesiëtnym cyfry w liczbie oznaczajâ kolejno: jednoôci,
  103. dziesiâtki, setki tysiëcy itd.)
  104.  
  105. Aby zaznaczyê, ûe liczba zapisana jest systemem dwójkowym, naleûy
  106. przed niâ postawiê znaczek "%".
  107.  
  108. A oto kilka przykîadów (przeliczeï):
  109.  
  110. %01110011 = 0 * 128 + 1 * 64 + 1 * 32 + 1 * 16 + 0 * 8 + 0
  111.  * 4 + 1 * 2 + 1 * 1 = 64 + 32 + 16 + 2 + 1 = 115
  112.  
  113. %1010 = 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1 = 8 + 2 = 10
  114.  
  115. %111 = 7 ;  %1 = 1 ;  %10 = 2 ;  %100 = 4
  116.  
  117. Jeûeli mniej wiëcej rozumiesz ten nowy system liczbowy, moûemy
  118. przejôê do omówienia rozkazu: "EOR". Wykonuje on operacjë
  119. logicznâ EXCLUSIVE OR. Prostszymi sîowami: EOR jest rodzajem
  120. pewnego dziaîania (tak jak dodawanie czy odejmowanie), ale jego
  121. argumentami sâ jedynki lub zera. Wynikiem EOR jest takûe jedynka
  122. lub zero (w zaleûnoôci od argumentów).
  123.  
  124. <l>
  125.  
  126. 1 EOR 1 = 0
  127.  
  128. 0 EOR 0 = 0
  129.  
  130. 1 EOR 0 = 1
  131.  
  132. 0 EOR 1 = 1
  133.  
  134. <txt>
  135. Jak widaê, EOR zwraca jedynkë, gdy ma dwa róûne argumenty. Dwa
  136. identyczne argumenty zwracajâ zero.
  137.  
  138. Jeûeli wykonamy dziaîanie:
  139.  
  140. <l>
  141.  
  142. A EOR B = C
  143.  
  144. <txt>
  145. (A -- moûe byê naszym plikiem, B -- hasîem, natomiast C to
  146. zaszyfrowany plik), to dziaîanie funkcji EOR, której argumentami
  147. sâ C oraz B, zwróci nam A:
  148.  
  149. <l>
  150.  
  151. C EOR B = A
  152.  
  153. <txt>
  154.  
  155. Oto inny przykîad tego typu:
  156.  
  157. <l>
  158.  
  159.       %10101100 - A
  160.  
  161.  EOR  %11110000 - B
  162.  
  163.  --------------
  164.  
  165.       %01011100 - C
  166.  
  167.  
  168.       %01011100 - C
  169.  
  170.  EOR  %11110000 - B
  171.  
  172.  --------------
  173.  
  174.       %10101100 - A
  175.  
  176. <txt>Teraz moûemy wreszcie przystâpiê do napisania naszego
  177. programu:
  178.  
  179. <l>
  180.  
  181.     INCDIR DF0:
  182.  
  183.     INCLUDE moj_dos.i
  184.  
  185.  
  186. ; Tu znajduje sië procedura otwierajâca bibliotekë dos.library
  187.  
  188. ; Po otwarciu biblioteki jej adres przesyîany jest do rejestru A6
  189.  
  190.     move.l d0,a6
  191.  
  192.     jsr _LVOOutput(a6)
  193.  
  194.     move.l d0,OutputBase
  195.  
  196. ; Póúniej OutputBase musi byê wykorzystane w celu wypisania czegokolwiek
  197.  
  198. ; w oknie CLI/SHELL
  199.  
  200. ; Otwierany jest plik ram:plik (w trybie OLDFILE)
  201.  
  202. ; Jego zawartoôê wczytywana jest (rozkazem _LVORead) do bufora DATA
  203.  
  204. ; Testowana jest wielkoôê pliku (iloôê odczytanych danych) i jeôli
  205.  
  206. ; jest ona róûna od zera - zapisywana jest pod FSize
  207.  
  208.     tst.l    d0
  209.  
  210.     beq.s    FileError
  211.  
  212.     move.l d0,FSize
  213.  
  214. ; Zamykany jest otwarty plik ram:plik (Polecenie _LVOClose)
  215.  
  216. ; Otwierany jest plik ram:haslo
  217.  
  218. ; Jego zawartoôê wczytywana jest do bufora HASLO
  219.  
  220. ; Testowana jest wielkoôê pliku (jeôli wiëksza od zero - zapisywana jest
  221.  
  222. ; pod HSize
  223.  
  224. ; Zamykany jest otwarty plik ram:haslo
  225.  
  226. MainProg:
  227.  
  228.     lea DATA,a0
  229.  
  230.     lea HASLO,a1
  231.  
  232.     move.l HSize,d7
  233.  
  234.     move.l FSize,d6
  235.  
  236.     sub.l #1,d7
  237.  
  238. Loop1:
  239.  
  240.     eor.b (a1)+,(a0)+
  241.  
  242.     sub.l #1,d6
  243.  
  244.     tst.l d6
  245.  
  246.     beq LoopEnd
  247.  
  248.     dbra d7,Loop1
  249.  
  250.     lea HASLO,a1
  251.  
  252.     move.l HSize,d7
  253.  
  254.     jmp Loop1
  255.  
  256. LoopEnd:
  257.  
  258. ; Teraz otwierany jest plik ram:plik (w trybie NEWFILE)
  259.  
  260. ; do tego pliku zapisywana jest zawartoôê bufora DATA
  261.  
  262. ; zamykany jest plik ram:plik
  263.  
  264. ; zamykana jest biblioteka dos.library
  265.  
  266. ; program koïczy swoje dziaîanie
  267.  
  268.     rts
  269.  
  270. FileError:
  271.  
  272. ; wyôwietlenie komunikatu o bîëdzie (np. za pomocâ polecenia _LVOWrite)
  273.  
  274. ; zamkniëcie biblioteki dos.library
  275.  
  276. ; wyjôcie z programu
  277.  
  278.  
  279. ; Oto niektóre ze zmiennych niezbëdnych do poprawnego dziaîania programu:
  280.  
  281. OutputBase: ds.l 1
  282.  
  283. FSize: ds.l 1
  284.  
  285. HSize: ds.l 1
  286.  
  287.     SECTION BSS,BSS_P
  288.  
  289. DATA: ds.b 50000
  290. HASLO: ds.b 100
  291.  
  292. <txt>Gîówny program jest bardzo krótki i ogranicza sië zaledwie
  293. do kilku instrukcji. Po zainicjowaniu rejestrów adresowych (A0
  294. zawiera adres, pod którym znajduje sië wczytany plik, natomiast
  295. A1 wskazuje na bufor, do którego wczytane jest hasîo) nastëpuje
  296. przesîanie do rejestrów danych odpowiednich danych. Rejestr D7
  297. zawiera liczbë bëdâcâ dîugoôciâ podanego hasîa (minus jeden, gdyû
  298. jak pamiëtamy, rozkaz dbra wykonuje pëtle o jeden raz wiëcej niû
  299. podane jest w rejestrze), natomiast D6 to dîugoôê wczytanego
  300. pliku (minus jeden). Rozpoczyna sië gîówna pëtla szyfrujâca
  301. (Loop1). Szyfrowany jest bajt po bajcie tyle razy, ile liter ma
  302. nasze hasîo. Bowiem ponowne uûycie rozkazu:
  303.  
  304. <l>
  305.  
  306.     eor.b (a1)+,(a0)+
  307.  
  308. <txt>szyfrowaîoby plik przypadkowymi danymi (i nie daîoby sië go
  309. póúniej odkodowaê), gdyû A1 nie wskazywaîby na nasze hasîo.
  310. Musimy wiëc regularnie odnawiaê zawartoôê tego rejestru. Robi to
  311. funkcja "lea HASLO,a1" wywoîywana zawsze, gdy pëtla wykonana
  312. zostanie tyle razy, ile liter jest w haôle. Nie moûemy teû
  313. zapomnieê o wielkoôci szyfrowanego pliku. Dlatego teû po
  314. zakodowaniu kaûdej litery odejmujemy od wielkoôci pliku jeden i
  315. sprawdzamy, czy wartoôê ta osiâgnëîa juû zero. Jeûeli tak,
  316. nastëpuje skok i pëtla koïczy swoje dziaîanie.
  317.  
  318. Wydaje mi sië, ûe niezrozumiaîa moûe byê dla niektórych linia:
  319.  
  320. <l>
  321.  
  322.     SECTION BSS,BSS_P
  323.  
  324. <txt>Na razie wytîumaczë tylko, co ta linia robi, ale nie
  325. powiem, dlaczego tak sië dzieje (o tym kiedy indziej).
  326.  
  327. Otóû linia ta (gdyû nie moûna jej nazwaê rozkazem) sprawia, ûe
  328. pamiëê dla wszystkich danych, znajdujâcych sië pod niâ
  329. (najczëôciej sâ to bufory), bëdzie przydzielana dopiero podczas
  330. uruchamiania programu. Gdybyômy të linië pominëli, nasz program
  331. (zasemblowany) zajmowaîby na dyskietce ponad 50 KB (nagrane
  332. zostaîyby bufory DATA i HASLO). A w ten sposób nagrana zostanie
  333. tylko informacja o tych buforach i ich wielkoôciach.
  334.  
  335. Nasz program wykorzystuje funkcjë EOR i dziëki temu nie musimy
  336. pisaê drugiego programu odkodowujâcego zaszyfrowane dane.
  337. Albowiem df0:code dziaîa w obie strony (wynika to z definicji
  338. funkcji EOR).
  339.  
  340. Niestety, "code" ma jednâ zasadniczâ wadë: nie potrafi kodowaê
  341. plików wiëkszych niû 50 000. Oczywiôcie moûna zwiëkszyê bufor
  342. DATA na 800 KB czy nawet wiëcej, ale do tego potrzebowalibyômy
  343. duûej iloôci pamiëci. Na szczëôcie jest rozwiâzanie tej
  344. sytuacji. Istnieje pewna procedura (biblioteki dos.library),
  345. umoûliwiajâca wczytywanie danego pliku "porcjami".
  346.  
  347. Nazwa: _LVOSeek (-66)
  348.  
  349. Funkcja: Przesuwa miejsce uchwytu pliku. Umoûliwia to wczytywanie
  350. danego pliku do pamiëci partiami. Rozkaz _LVORead wczytuje
  351. zawartoôê pliku od jego poczâtku. Za pomocâ _LVOSeek moûemy
  352. zmieniê miejsce, od którego _LVORead bëdzie wczytywaîo dane.
  353. Dziëki temu moûemy wczytaê pierwsze 10 KB pliku, przesunâê uchwyt
  354. pliku o 10 KB dalej, ponownie wczytaê 10 KB, znów przesunâê
  355. uchwyt itd.
  356.  
  357. Wejôcie: D1 -- uchwyt pliku (otrzymany za pomocâ polecenia _LVOOpen)
  358.  
  359. D2 -- Liczba okreôlajâca nowâ pozycjë uchwytu
  360.  
  361. D3 -- tryb, czyli sposób, w jaki powyûsza liczba ma byê traktowana
  362.  
  363. Dopuszczalne sâ nastëpujâce tryby: OFFSET_BEGINNING -- liczba
  364. oznacza odlegîoôê wzglëdem poczâtku pliku (np. liczba 1234 ustawi
  365. uchwyt pliku na 1234 bajt tego pliku); OFFSET_CURRENT -- liczba w
  366. rejestrze D2 oznacza przesuniëcie pozycji wzglëdem pozycji
  367. aktualnej (np. liczba 1234 ustawi uchwyt pliku o 1234 bajty dalej
  368. od aktualnego ustawienia uchwytu); OFFSET_END -- liczba oznacza
  369. odlegîoôê wzglëdem koïca pliku (np. 1234 ustawi uchwyt pliku na
  370. 1234 bajt od koïca).
  371.  
  372. UWAGA! W trybie OFFSET_CURRENT dopuszczalne sâ takûe liczby
  373. ujemne (np. -1234 przesunie uchwyt pliku o 1234 bajty wstecz).
  374.  
  375. Poniewaû omówiliômy juû gîówne polecenia biblioteki dos, na
  376. nastëpnej lekcji zajmiemy sië bibliotekâ INTUITION. Nauczymy sië
  377. otwieraê wîasne okna, ekrany i gadûety. Jeûeli wystarczy nam
  378. czasu, stworzymy naszâ pierwszâ aplikacjë opartâ na interfejsie
  379. graficznym. Na kolejnych lekcjach bëdziemy sië uczyli tworzyê
  380. wîasne MENU, rysunki itd. Juû niedîugo bëdziemy pisali programy
  381. wykorzystujâce polecenia wielu bibliotek. Nasz kurs zakoïczymy
  382. stworzeniem wîasnej biblioteki.
  383.  
  384. -- No, no, ciekawe, ale jeszcze ciekawsze: "TRZY DORZYJEM TEY
  385. POCJEHY, ABY KONJEC TFEGO KÓRSÓ TRAFIΠPOD STÛEHY?"
  386.  
  387. -- Ômiej sië ômiej, ale zobaczysz, ûe teraz bëdziemy sië uczyli
  388. coraz szybciej.
  389.  
  390. -- Obyô miaî racjë! A tymczasem do nastëpnego MA.
  391.  
  392. -- Do nastëpnego.
  393.  
  394.