Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- START ORG $1000
- LEA ispis1, A1 *u registar A1 zapisujemo lokaciju stringa ispis1
- MOVE.B #14, D0 *stavljam zadatak(redni broj naredbe) 14 u registar D0
- TRAP #15
- LEA dat_naziv, A1 *stavljam adresu stringa ime_dat u registar A1
- MOVE.B #2, D0 *naredba 2 za ucitavanje zn. niza sa tipkovnice
- TRAP #15
- MOVE.B #51, D0 *stavljamo naredbu za otvaranje datoteke (unijeli smo naziv u A1)
- TRAP #15
- MOVE.B #53, D0 *naredba za čitanje datoteke
- MOVE.L #100, D2 *govorimo koliko ćemo pročitat bajtova
- LEA sadrzaj, A1 *govorimo di ćemo zapisat pročitano iz datoteke
- TRAP #15
- MOVE.B #14, D0 *naredba za ispis sa adrese A1
- LEA ispis2, A1 *stavljamo adresu polja "ispis2" u registar A1
- TRAP #15 *pokrecemo naredbu
- 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)
- LEA sadrzaj, A1 *..stavljamo adresu "sadrzaj" (tu smo pročitali datoteku) u adresni registar A1
- TRAP #15 *pokrecemo naredbu
- MOVE.B #13, D0 *naredba za ispis sa adrese A1
- LEA ispis3, A1 *zelimo ispisati "Rjesenje: "
- TRAP #15 *pokrecemo naredbu
- *problem - brojevi u datoteci su zapisani u znakovnom obliku
- *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)
- *kada bismo taj broj procitali u registar u tom obliku, dobili bismo 313233, dakle tristo dvanaest tisuca dvjesto trideset i dva
- *ocito ne mozemo tako raditi, brojeve koji su u znakovnom obliku moramo prvo pretvoriti u njihov originalni oblik
- *kako bismo mogli raditi sa njima!
- *jedini nacin kako ovo napraviti je da razlikujemo "tezine" znamenki broja
- *ako imamo upravo "123" onda nam je "3" jedinica, "2" desetica a "1" stotica
- *dakle trebamo procitati znak, konvertirat ga u broj i potom pomnoziti sa njegovom tezinom
- *123 = 3*1 + 2*10 + 1*100 = 123
- *kao sto sam rekao, "1" i "2" i "3" su zapisani kao "31" "32" "33" respektivno (napomena to su sve heksadecimalni zapisi)
- *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)
- *isto tako vrijedi za "2" (odnosno "32), ako oduzmemo 30 od 32 dobijemo 2
- *dakle vrlo prirodno, procitani znak (znamenku) iz datoteke oduzmemo za 30 i dobit cemo broj,
- *samo jos trebamo pomnoziti sa njegovom tezinom
- *kako bi si skratili muke, mi cemo se pozicionirati na kraj stringa od broja i "kreirati broj" od kraja prema pocetku
- *jer tako uvijek znamo da je prva znamenka jedinica, pa slijedi desetica, pa stotica,tisucica itd.
- *kada bi isli sa pocetka ka kraju onda ne bi znali razlikovati je li prvi broj desetica, ili je stotica ili pak jedinica
- *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
- *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
- *cemo uvijek znati da su jedinice
- *kreiranje broja od kraja prema pocetku se vrsi ovako:
- * -procitaj znak (te pomakni adresni registar na prethodni)
- * -pretvori u broj (sub #48)
- * -mnozi sa tezinom (MUL broj, tezina)
- * -povecaj tezinu za puta 10 (za sljedeci broj)
- * -dodaj u sumu (ADD broj, suma)
- * -smanji brojac znamenki
- * -ako je brojac razlicit od 0 znaci da imamo jos pa ponovi prvi korak
- *na kraju u sumi imamo gotov broj u binarnom obliku pa ga mozemo koristiti
- *u principu, ako imamo 123, onda:
- *citamo 3, pretvaramo u broj (tako sto oduzmemo za 48), mnozimo sa 1 = 3, dodamo ga u sumu (suma iznosi 3)
- *citamo 2, pretvaramo u broj, mnozimo sa 10 (jer smo povecali tezinu) = 20, dodamo ga u sumu (sada je suma 23)
- *citamo 1, pretvaramo u broj, mnozimo sa 100 (jer smo povecali tezinu) = 100, dodamo ga u sumu (sada je suma 123)
- LEA sadrzaj, A3 *sa R cemo ici kroz datoteku i vrsiti algoritam
- novi_broj *za svaki novi broj
- MOVE.L #0, D5 *resetiramo brojac znamenki (trebat ce nam kada budemo isli "unazad" i mnozili" kako bi znali da smo zavrsili)
- MOVE.L #0, D1 *D1 nam je "suma" pa nju uvijek resetiramo
- prebroj_znamenke *prvo "brojimo" koliko broj ima znamenki (kako bismo mogli znata kada stati) pocevsi od pocetka ka kraju broja
- MOVE.B (A3)+, D4 *citamo znak sa A3 u D4 i pomicemo odmah A3 za 1
- CMP #32, D4 *usporedujem sa razmakom (razmak u ASCII je 32, ili heksadecimalno "20")
- BEQ kreiraj_broj *ako je razmak onda znaci da smo dosli do kraja broja pa pocinjemo kreiranje broja (tako da se vracamo unazad)
- CMP #46, D4 *isto vrijedi i za tocku (tocka u SACII je 46, hex 2E)
- BEQ kreiraj_broj
- ADD #1, D5 *ako nije tocka ni razmak, povecavamo r5 za 1 (to nam je brojac zanmenki)
- JMP prebroj_znamenke *te ponovno pokrecemo petlju sve dok ne dodemo do kraja broja
- *e sada kada ova gore petlja zavrsi, imat cemo broj znamenki u D5
- *te ce se ujedno A3 pomaknuti prema desno (tj. na kraj broja)
- *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)
- kreiraj_broj
- MOVE.L #1, D7 *prvo trebamo u D7 (koji nam predstavlja "tezinu" broja) staviti 1
- 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
- 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)
- nova_znamenka *kada smo na kraju broja, znamo da se nalazimo na "jedinici" pa mozemo bez problema krenuti kreirati broj, ovo je petlja:
- MOVE.L #0, D6 *D6 čistimo prije nego čitamo u njega
- 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)
- SUB #1, A2
- SUB #48, D6 *pretvaramo znak iz D6 u broj (tako sto oduzimamo 30, tj. dekadski 48)
- MULU D7, D6 *sada mnozimo D6 sa brojacem tezine (za prvi krug petlje ce to biti 1, kasnije 10 pa 100 itd.)
- ADD D6, D1 *zbrajamo D6 u sumu koja nam je D1
- 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
- SUB #1, D5 *smanjujemo brojac znamenki
- CMP #0, D5 *ako smo ga smanjili do "0" znaci da smo sve znamenke rijesili
- BEQ ispisi *pa pokrecemo ispis
- JMP nova_znamenka *inace, idemo na novu tj. prethodnu znamenku
- *kada ova petlja zavrsi, pokrece se ispis:
- ispisi MOVE.L #3, D0 *naredba za ispis broja je 3
- SUB #1, D1 *tek sada mozemo zapravo smanjiti broj za 1 pa to cinimo
- TRAP #15 *ispisujemo tako smanjeni broj (pogle si naredbu 6)
- MOVE.L #32, D1 *trebamo i razmak ispisati kako nam se ne bi brojevi ispisivali spojeno, u D1 stavljamo ASCII razmak (dekadski 32)
- MOVE.L #6, D0 *naredba za ispis znaka je 6
- TRAP #15 *ispisujemo razmak
- *kada smo stvorili i ispisali broj, trebamo provjeriti jesmo li dosli do kraja, to cemo uraditi tako sto usporedujemo
- *registar D4 u koji smo citali u petlji "prebroj_znamenke", ta petlja je iskocila kada je naisla na razmak ili tocku
- CMP #46, D4 *usporedujemo D4 sa tockom
- BNE novi_broj *ako nije bila tocka pokrecemo ponovno sve za novi broj
- *ako je bila tocka onda idemo dalje:
- *treba ispisati korijen zadnjeg broja
- MOVE.B #9,D0
- TRAP #15 Halt Simulator
- STOP #$2000 *naredba zaustavlja program
- ispis1 DC.B 'Unesite ime datoteke: ', 0
- ispis2 DC.B 'Ispis iz datoteke: ', $D, $A, 0
- ispis3 DC.B 'Rjesenje: ', 0
- ispis4 DC.B 'Unesite niz koji zelite zamjeniti: ', 0
- ispis5 DC.B 'Unesite niz za zamjenu: ', 0
- dat_naziv DS.B 30
- sadrzaj DS.B 100
- END START
- *~Font name~Courier New~
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement