Advertisement
Guest User

thf

a guest
Jan 26th, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. START   ORG $1000
  2.        
  3.     LEA ispis1, A1 *u registar A1 zapisujemo lokaciju stringa ispis1
  4.     MOVE.B #14, D0 *stavljam zadatak(redni broj naredbe) 14 u registar D0
  5.     TRAP #15
  6.  
  7.     LEA dat_naziv, A1 *stavljam adresu stringa ime_dat u registar A1
  8.     MOVE.B #2, D0   *naredba 2 za ucitavanje zn. niza sa tipkovnice
  9.     TRAP #15
  10.  
  11.     MOVE.B #51, D0 *stavljamo naredbu za otvaranje datoteke (unijeli smo naziv u A1)
  12.      TRAP #15
  13.  
  14.     MOVE.B #53, D0  *naredba za čitanje datoteke
  15.     MOVE.L #100, D2  *govorimo koliko ćemo pročitat bajtova
  16.     LEA sadrzaj, A1 *govorimo di ćemo zapisat pročitano iz datoteke
  17.     TRAP #15
  18.  
  19.     MOVE.B #14, D0 *naredba za ispis sa adrese A1
  20.     LEA ispis2, A1  *stavljamo adresu polja "ispis2" u registar A1
  21.     TRAP #15      *pokrecemo naredbu
  22.  
  23.     MOVE.B #13, D0 *naredba za ispis sa adrese A1 (13 ispiše tekst i prijeđe u novi red, 14 samo ispiše tekst)
  24.     LEA sadrzaj, A1   *..stavljamo adresu "sadrzaj" (tu smo pročitali datoteku) u adresni registar A1
  25.     TRAP #15    *pokrecemo naredbu
  26.  
  27.     MOVE.B #13, D0  *naredba za ispis sa adrese A1
  28.     LEA ispis3, A1  *zelimo ispisati "Rjesenje: "
  29.     TRAP #15    *pokrecemo naredbu
  30.  
  31.        
  32.         *problem - brojevi u datoteci su zapisani u znakovnom obliku
  33.         *npr broj "123" je u memoriji zapisan kao "31 32 33" (ASCII od znaka 1 je 31, za 2 je 32 za 3 je 33)
  34.         *kada bismo taj broj procitali u registar u tom obliku, dobili bismo 313233, dakle tristo dvanaest tisuca dvjesto trideset i dva
  35.         *ocito ne mozemo tako raditi, brojeve koji su u znakovnom obliku moramo prvo pretvoriti u njihov originalni oblik
  36.         *kako bismo mogli raditi sa njima!
  37.        
  38.         *jedini nacin kako ovo napraviti je da razlikujemo "tezine" znamenki broja
  39.         *ako imamo upravo "123" onda nam je "3" jedinica, "2" desetica a "1" stotica
  40.         *dakle trebamo procitati znak, konvertirat ga u broj i potom pomnoziti sa njegovom tezinom
  41.        
  42.         *123 = 3*1 + 2*10 + 1*100 = 123
  43.         *kao sto sam rekao, "1" i "2" i "3" su zapisani kao "31" "32" "33" respektivno (napomena to su sve heksadecimalni zapisi)
  44.         *kako bismo od "1" dobili 1, odnosno od "31" dobili 1, sve sto moramo uraditi je oduzeti broj za 30 HEX (tj. za 48 u heksadekadskom zapisu)
  45.         *isto tako vrijedi za "2" (odnosno "32), ako oduzmemo 30 od 32 dobijemo 2
  46.         *dakle vrlo prirodno, procitani znak (znamenku) iz datoteke oduzmemo za 30 i dobit cemo broj,
  47.         *samo jos trebamo pomnoziti sa njegovom tezinom
  48.        
  49.         *kako bi si skratili muke, mi cemo se pozicionirati na kraj stringa od broja i "kreirati broj" od kraja prema pocetku
  50.         *jer tako uvijek znamo da je prva znamenka jedinica, pa slijedi desetica, pa stotica,tisucica itd.
  51.         *kada bi isli sa pocetka ka kraju onda ne bi znali razlikovati je li prvi broj desetica, ili je stotica ili pak jedinica
  52.         *npr. ako imamo brojeve "123", "19" i "1" u datoteci, kada procitamo "1" u prvom slucaju ce to biti stotica, u drugom desetica a u trecem ce to biti jedinica
  53.         *buduci da mi unaprijed ne znamo koliko znamenki ima broj ovaj pristup je los.. ali ako idemo od kraja broja, za znamenke "3" "9" i "1" iz ta tri gore broja
  54.         *cemo uvijek znati da su jedinice
  55.        
  56.         *kreiranje broja od kraja prema pocetku se vrsi ovako:
  57.         *   -procitaj znak (te pomakni adresni registar na prethodni)
  58.         *   -pretvori u broj (sub #48)
  59.         *   -mnozi sa tezinom (MUL broj, tezina)
  60.         *   -povecaj tezinu za puta 10 (za sljedeci broj)
  61.         *   -dodaj u sumu (ADD broj, suma)
  62.         *   -smanji brojac znamenki
  63.         *   -ako je brojac razlicit od 0 znaci da imamo jos pa ponovi prvi korak
  64.        
  65.         *na kraju u sumi imamo gotov broj u binarnom obliku pa ga mozemo koristiti
  66.         *u principu, ako imamo 123, onda:
  67.         *citamo 3, pretvaramo u broj (tako sto oduzmemo za 48), mnozimo sa 1 = 3, dodamo ga u sumu  (suma iznosi 3)
  68.         *citamo 2, pretvaramo u broj, mnozimo sa 10 (jer smo povecali tezinu) = 20, dodamo ga u sumu (sada je suma 23)
  69.         *citamo 1, pretvaramo u broj, mnozimo sa 100 (jer smo povecali tezinu) = 100, dodamo ga u sumu (sada je suma 123)
  70.        
  71.         LEA sadrzaj, A3 *sa R cemo ici kroz datoteku i vrsiti algoritam
  72.        
  73. novi_broj   *za svaki novi broj
  74.         MOVE.L #0, D5   *resetiramo brojac znamenki (trebat ce nam kada budemo isli "unazad" i mnozili" kako bi znali da smo zavrsili)
  75.         MOVE.L #0, D1   *D1 nam je "suma" pa nju uvijek resetiramo
  76. prebroj_znamenke    *prvo "brojimo" koliko broj ima znamenki (kako bismo mogli znata kada stati) pocevsi od pocetka ka kraju broja
  77.         MOVE.B (A3)+, D4    *citamo znak sa A3 u D4 i pomicemo odmah A3 za 1
  78.         CMP #32, D4 *usporedujem sa razmakom (razmak u ASCII je 32, ili heksadecimalno "20")
  79.         BEQ kreiraj_broj    *ako je razmak onda znaci da smo dosli do kraja broja pa pocinjemo kreiranje broja (tako da se vracamo unazad)
  80.         CMP #46, D4 *isto vrijedi i za tocku (tocka u SACII je 46, hex 2E)
  81.         BEQ kreiraj_broj
  82.         ADD #1, D5  *ako nije tocka ni razmak, povecavamo r5 za 1 (to nam je brojac zanmenki)
  83.         JMP prebroj_znamenke    *te ponovno pokrecemo petlju sve dok ne dodemo do kraja broja
  84.    
  85.         *e sada kada ova gore petlja zavrsi, imat cemo broj znamenki u D5
  86.         *te ce se ujedno A3 pomaknuti prema desno (tj. na kraj broja)
  87.         *zapravo se nece pomaknuti tocno na kraj broja, vec ce se pomaknuti na pocetak sljedeceg (jer kada procita razmak, pomakne se odmah za 1 i tek onda uspredujemo je li bio razmak)
  88. kreiraj_broj   
  89.         MOVE.L #1, D7   *prvo trebamo u D7 (koji nam predstavlja "tezinu" broja) staviti 1
  90.         MOVE.L A3, A2   *A3 nam je na pocetku sljedeceg broja pa cemo njega koristiti za novi broj, zato koristimo pomocni A2 registar kako bismo isli od kraja ka pocetku
  91.         SUB #2, A2  *A3 tj. A2 je sada na pocetku sljedeceg broja, vracamo se unazad za 2 mjesta kako bi "sjeli" na kraj tekuceg broja (jedno unazad je razmak, a drugo mjesto unazad je zadnja znamenka tekuceg broja)
  92. nova_znamenka   *kada smo na kraju broja, znamo da se nalazimo na "jedinici" pa mozemo bez problema krenuti kreirati broj, ovo je petlja:
  93.         MOVE.L #0, D6   *D6 čistimo prije nego čitamo u njega
  94.         MOVE.B (A2), D6 *citamo znak sa A2 (sprva je A2 pozicioniran na kraj broja) u D6 te pomicemo A2 za jedno mjesto unazad (zato ide ovaj #-1)
  95.         SUB #1, A2
  96.         SUB #48, D6 *pretvaramo znak iz D6 u broj (tako sto oduzimamo 30, tj. dekadski 48)
  97.         MULU D7, D6 *sada mnozimo D6 sa brojacem tezine (za prvi krug petlje ce to biti 1, kasnije 10 pa 100 itd.)
  98.         ADD D6, D1  *zbrajamo D6 u sumu koja nam je D1
  99.         MULU #10, D7    *sada povecavamo tezinu tako da ju mnozimo za 10 (na ovaj nacin se tezina pomice sa 1 na 10, te sa 10 na 100) za sljedeci krug petlje
  100.         SUB #1, D5  *smanjujemo brojac znamenki
  101.         CMP #0, D5  *ako smo ga smanjili do "0" znaci da smo sve znamenke rijesili
  102.         BEQ ispisi  *pa pokrecemo ispis
  103.         JMP nova_znamenka   *inace, idemo na novu tj. prethodnu znamenku
  104.        
  105.         *kada ova petlja zavrsi, pokrece se ispis:
  106. ispisi      MOVE.L #3, D0   *naredba za ispis broja je 3
  107.         SUB #1, D1  *tek sada mozemo zapravo smanjiti broj za 1 pa to cinimo
  108.         TRAP #15    *ispisujemo tako smanjeni broj (pogle si naredbu 6)
  109.         MOVE.L #32, D1  *trebamo i razmak ispisati kako nam se ne bi brojevi ispisivali spojeno, u D1 stavljamo ASCII razmak (dekadski 32)
  110.         MOVE.L #6, D0   *naredba za ispis znaka je 6
  111.         TRAP #15    *ispisujemo razmak
  112.        
  113.         *kada smo stvorili i ispisali broj, trebamo provjeriti jesmo li dosli do kraja, to cemo uraditi tako sto usporedujemo
  114.         *registar D4 u koji smo citali u petlji "prebroj_znamenke", ta petlja je iskocila kada je naisla na razmak ili tocku
  115.         CMP #46, D4 *usporedujemo D4 sa tockom
  116.         BNE novi_broj   *ako nije bila tocka pokrecemo ponovno sve za novi broj
  117.         *ako je bila tocka onda idemo dalje:
  118.         *treba ispisati korijen zadnjeg broja
  119.            
  120.         MOVE.B  #9,D0
  121.         TRAP    #15     Halt Simulator
  122.         STOP #$2000 *naredba zaustavlja program
  123.        
  124.  
  125. ispis1 DC.B 'Unesite ime datoteke: ', 0
  126. ispis2  DC.B 'Ispis iz datoteke: ', $D, $A, 0
  127. ispis3  DC.B 'Rjesenje: ', 0
  128. ispis4  DC.B 'Unesite niz koji zelite zamjeniti: ', 0
  129. ispis5 DC.B 'Unesite niz za zamjenu: ', 0
  130.  
  131.  
  132. dat_naziv   DS.B 30
  133. sadrzaj     DS.B 100
  134.         END START
  135.  
  136. *~Font name~Courier New~
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement