Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
Postano: 19:06 pet, 9. 11. 2012 Naslov: broj jedinica |
|
|
zanima me postoji li ljepši način za prebrojati jedinice u binarnom zapisu broja s adrese $6000
meni ovo moje djeluje dosta šlampavo, pa da pitam :)
[code:1]
DATA: EQU $6000
PROGRAM: EQU $6100
ORG DATA
VALUE: DS.W 1
RESULT: DS.B 1
MASK: EQU $0001
ORG PROGRAM
START:
MOVE.W VALUE, D0
BEQ.S KRAJ
MOVEQ #0, D2
LOOP: MOVE.W D0, D1
AND.W #MASK, D1
ADD.B D1, D2
LSR.W #1, D0
BNE.S LOOP
KRAJ: MOVE.B D2, RESULT
MOVE.B #9,D0
TRAP #15 ; halt simulator
END START[/code:1]
zanima me postoji li ljepši način za prebrojati jedinice u binarnom zapisu broja s adrese $6000
meni ovo moje djeluje dosta šlampavo, pa da pitam
Kod: |
DATA: EQU $6000
PROGRAM: EQU $6100
ORG DATA
VALUE: DS.W 1
RESULT: DS.B 1
MASK: EQU $0001
ORG PROGRAM
START:
MOVE.W VALUE, D0
BEQ.S KRAJ
MOVEQ #0, D2
LOOP: MOVE.W D0, D1
AND.W #MASK, D1
ADD.B D1, D2
LSR.W #1, D0
BNE.S LOOP
KRAJ: MOVE.B D2, RESULT
MOVE.B #9,D0
TRAP #15 ; halt simulator
END START |
|
|
[Vrh] |
|
Atomised Forumaš(ica)
Pridružen/a: 04. 09. 2007. (15:33:59) Postovi: (399)16
Lokacija: Exotica
|
|
[Vrh] |
|
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
|
[Vrh] |
|
ivstojic Forumaš(ica)
Pridružen/a: 20. 03. 2007. (08:52:16) Postovi: (23)16
|
|
[Vrh] |
|
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
Postano: 19:35 sri, 28. 11. 2012 Naslov: |
|
|
da ne otvaram novu temu, pitat ću ovdje:
nikako da shvatim zbog čega mi program uvijek kaže da su nizovi različiti (osim kad stavim duljinu 0)
to je 16. zadatak za praktični
[code:1]
;Provjerite da li su tri niza ASCII znakova jednaka.
;Početne adrese stringova dane su 32 bitnim varijablama START1, START2, START3 s adresa $6000, $6004, $6008.
;Prvi bajt svakog stringa označava duljinu tog stringa u bajtovima.
;Ako su stringovi jednaki postavi varijablu MATCH s adrese $600C na 0, inače postavi na -1.
DATA: EQU $6000
PROGRAM: EQU $6100
ORG DATA
START1: DS.L 1
START2: DS.L 1
START3: DS.L 1
MATCH: DS.W 1
ORG PROGRAM
START:
MOVEA.L START1, A0
MOVEA.L START2, A1
MOVEA.L START3, A2
MOVEQ #-1, D1
MOVE.B (A0)+, D0
CMP.B (A1)+, D0
BNE.S KRAJ
CMP.B (A2)+, D0
BNE.S KRAJ
TST.B D0
BEQ.S ISTI
SUBQ.W #1, D0
LOOP: CMPM.B (A0)+, (A1)+
DBNE D0, LOOP
BNE.S KRAJ
MOVEA.L START1, A0
MOVE.B (A0)+, D0
SUBQ.W #1, D0
LOOP1: CMPM.B (A0)+, (A2)+
DBNE D0, LOOP1
BNE.S KRAJ
ISTI: MOVEQ #0, D1
KRAJ: MOVE.W D1, MATCH
MOVE.B #9,D0
TRAP #15 ; halt simulator
END START
[/code:1]
da ne otvaram novu temu, pitat ću ovdje:
nikako da shvatim zbog čega mi program uvijek kaže da su nizovi različiti (osim kad stavim duljinu 0)
to je 16. zadatak za praktični
Kod: |
;Provjerite da li su tri niza ASCII znakova jednaka.
;Početne adrese stringova dane su 32 bitnim varijablama START1, START2, START3 s adresa $6000, $6004, $6008.
;Prvi bajt svakog stringa označava duljinu tog stringa u bajtovima.
;Ako su stringovi jednaki postavi varijablu MATCH s adrese $600C na 0, inače postavi na -1.
DATA: EQU $6000
PROGRAM: EQU $6100
ORG DATA
START1: DS.L 1
START2: DS.L 1
START3: DS.L 1
MATCH: DS.W 1
ORG PROGRAM
START:
MOVEA.L START1, A0
MOVEA.L START2, A1
MOVEA.L START3, A2
MOVEQ #-1, D1
MOVE.B (A0)+, D0
CMP.B (A1)+, D0
BNE.S KRAJ
CMP.B (A2)+, D0
BNE.S KRAJ
TST.B D0
BEQ.S ISTI
SUBQ.W #1, D0
LOOP: CMPM.B (A0)+, (A1)+
DBNE D0, LOOP
BNE.S KRAJ
MOVEA.L START1, A0
MOVE.B (A0)+, D0
SUBQ.W #1, D0
LOOP1: CMPM.B (A0)+, (A2)+
DBNE D0, LOOP1
BNE.S KRAJ
ISTI: MOVEQ #0, D1
KRAJ: MOVE.W D1, MATCH
MOVE.B #9,D0
TRAP #15 ; halt simulator
END START
|
|
|
[Vrh] |
|
Phoenix Forumaš(ica)
Pridružen/a: 15. 05. 2010. (18:46:07) Postovi: (164)16
Sarma: -
|
Postano: 1:50 čet, 29. 11. 2012 Naslov: |
|
|
Problem je u tome što nakon petlje [tt]LOOP[/tt] imaš u [tt]D0[/tt] pohranjenu vrijednost [tt]0000FFFF[/tt], a nakon unosa duljine prvog stringa u isti registar, recimo da je duljina bila [tex]3[/tex], u njemu imaš [tt]0000FF03[/tt]. To nije dobro jer nakon tri oduzimanja u petlji [tt]LOOP1[/tt] dobivaš broj [tt]0000FF00[/tt] koji je svakako različit od nule, stoga ti se ta petlja vrti najviše [tex](FF00)_{16}[/tex] dodatnih, nepoželjnih koraka, odnosno u nekom trenutku možda i stane ako zaključi da su proširenja promatranih stringova ipak različita (ovisno što se već nalazi u ostatku memorije koja nam, usput, možda nije ni dozvoljena na korištenje).
Dakle, dovoljno je dodatni naredbu poput [tt]MOVE.W #0 D0[/tt] nakon petlje [tt]LOOP[/tt] i naredbe [tt]BNE.S KRAJ[/tt] i program će ti funkcionirati kako si zamislila. :)
Problem je u tome što nakon petlje LOOP imaš u D0 pohranjenu vrijednost 0000FFFF, a nakon unosa duljine prvog stringa u isti registar, recimo da je duljina bila [tex]3[/tex], u njemu imaš 0000FF03. To nije dobro jer nakon tri oduzimanja u petlji LOOP1 dobivaš broj 0000FF00 koji je svakako različit od nule, stoga ti se ta petlja vrti najviše [tex](FF00)_{16}[/tex] dodatnih, nepoželjnih koraka, odnosno u nekom trenutku možda i stane ako zaključi da su proširenja promatranih stringova ipak različita (ovisno što se već nalazi u ostatku memorije koja nam, usput, možda nije ni dozvoljena na korištenje).
Dakle, dovoljno je dodatni naredbu poput MOVE.W #0 D0 nakon petlje LOOP i naredbe BNE.S KRAJ i program će ti funkcionirati kako si zamislila.
|
|
[Vrh] |
|
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
|
[Vrh] |
|
Phoenix Forumaš(ica)
Pridružen/a: 15. 05. 2010. (18:46:07) Postovi: (164)16
Sarma: -
|
Postano: 13:57 čet, 29. 11. 2012 Naslov: |
|
|
Možda bi bilo korisno i da kažem sljedeće: Trace info (6. gumb slijeva u gornjoj traci, odnosno F7) ti uvelike pomaže u debuggiranju. Tako možeš analizirati svoj kod liniju po liniju i pratiti promjene u memoriji, registrima i čemu već ne. :) Tako bi, recimo, u svom kodu primijetila da se previše puta vrtiš u petlji [tt]LOOP1[/tt], pa pogledom na registar [tt]D0[/tt] bi skužila da nije jednak nuli, a trebao bi biti. :D
Poprilično su korisne i zelene lampice s lijeve strane dok pokrećeš program. Promijeniš li koju u crvenu i pokreneš li program, izvršit će se sve naredbe do one prve po redu koja ima upaljenu crvenu lampicu. Tako da, primjerice, ako ti početni dio koda radi, a sam se izvršava u povećem broju ciklusa, ovako ga efikasno preskočiš. :D
Eto, čisto par savjeta ako nisi do sada skužila da se kodovi mogu poprilično efikasno debuggirati, a ne samo izvrtiti od početka do kraja. :) A i ovo su valjda najkorisnije stvari dok učiš programirati i dok učiš kako se sve to odvija i ponaša u memoriji. :)
Možda bi bilo korisno i da kažem sljedeće: Trace info (6. gumb slijeva u gornjoj traci, odnosno F7) ti uvelike pomaže u debuggiranju. Tako možeš analizirati svoj kod liniju po liniju i pratiti promjene u memoriji, registrima i čemu već ne. Tako bi, recimo, u svom kodu primijetila da se previše puta vrtiš u petlji LOOP1, pa pogledom na registar D0 bi skužila da nije jednak nuli, a trebao bi biti.
Poprilično su korisne i zelene lampice s lijeve strane dok pokrećeš program. Promijeniš li koju u crvenu i pokreneš li program, izvršit će se sve naredbe do one prve po redu koja ima upaljenu crvenu lampicu. Tako da, primjerice, ako ti početni dio koda radi, a sam se izvršava u povećem broju ciklusa, ovako ga efikasno preskočiš.
Eto, čisto par savjeta ako nisi do sada skužila da se kodovi mogu poprilično efikasno debuggirati, a ne samo izvrtiti od početka do kraja. A i ovo su valjda najkorisnije stvari dok učiš programirati i dok učiš kako se sve to odvija i ponaša u memoriji.
|
|
[Vrh] |
|
Loo Forumaš(ica)
Pridružen/a: 11. 06. 2012. (16:02:07) Postovi: (D0)16
Spol:
|
|
[Vrh] |
|
|