[ wex-alpha @ 08.10.2004. 07:12 ] @
Dole su dva primjera ARC programa. Ako iko moze da ih pregleda, i da potvrdi !komentar koji sam dao... hvala



PS
Prvi primjer nije komentiran, ali drugi jeste... ista stvar.
Nisam zadovoljan sa komentarom za ovu instukciju u drugom primjeru


Code:

***zamjena varijabli***

.begin
.org 2048

zamjena_var:

ld [x], %r1
ld [y], %r2

st %r1, [y]
st %r2, [x]


x: 15
y: 9

end. 


***oduzimanje dva broja***

.begin           !pocni sa asembliranjem
.org 2048        ! promijeni location counter na 2048 

oduzimanje_broja:

ld [x], %r1 ! ucitaj varijablu x u registar 1
ld [y], %r2 ! ucitaj varijablu y u registar 2

orncc %r1, r%0, %r1 ! r-1 komplement
addcc %r1, 1, %r1   ! r komplement
addcc %r1, %r2, r%3 ! saberi registre %r1 sa %r2 i pohrani u %r3

jmpl %r14 + 4, %r0  ! jump and link (povratak iz subrutine)

st r%3, [z]         ! pohrani %r3 u varijablu Z   


x: 4            !Deklaracija varijable x    
y: 6            !Deklaracija varijable y
z: 0                !Deklaracija varijable z   

end. 



Hvala
[ stameni @ 08.10.2004. 12:20 ] @
U prvom primeru sumnjivo je što se varijable x i z nalaze na mestu na kome može da »protrči« instruction pointer. Naravno, moguće je da se koriti neki potpuno drukčiji adresni mod i da se podaci ne smeštaju odmah iza koda, ali...

Ono što je potencijalno sumnjivo kod oduzimanja je sledeća kombinacija:

Code:


jmpl %r14 + 4, %r0  ! jump and link (povratak iz subrutine)

st r%3, [z]         ! pohrani %r3 u varijablu Z   



Nisam siguran koji je mikroprocesor u pitanju, ali izgleda da ovde imaš povratak u glavni program pre nego što smestiš rezultat u varijablu z.

Uz to, kod orncc moguće je da koristiš neinicijalizovani registar %r0.

P. S. Zapravo, ti želiš da mi uradimo - šta?
[ wex-alpha @ 08.10.2004. 15:45 ] @
E bas to :)

Da li sam ispravno komentarisao kod?

PS
%r0 kod ARC-a se ne moze mijenjati, i uvijek iznosi 0, tako da sam i radio r-1 komplement preko njega.
[ stameni @ 08.10.2004. 19:08 ] @
Ako je reč samo o komentarisanju tuđeg programa, za koji pretpostavljamo da radi... Tja, prilično neobično pitanje :)

Za detalje je, naravno, obavezan skup instrukcija odgovarajućeg procesora. Ipak, ako je ovo ono što mislim da jeste, obično se ono što si obeležio kao r-1 komplement zove prvi (nepotpuni), a kao r drugi (potpuni) komplement.

Ako je orncc prvi komplement, mora se priznati da je sam mnemonik prilično neobično odabran :) Što, naravno, ne mora mnogo da čudi...
[ Sundance @ 08.10.2004. 20:54 ] @
Meni ovaj ARC izgleda kao pljunuti ARM. Ruzni mnemonici, kao i u svakom RISC-u. Samo mi nije jasno zasto forsiras orncc/addcc instrukcije u kojima se postavljaju zastavice (condition codes). Definirano opisom subrutine ili sta?

A i ja ne bih stavio ruku u vatru da ce se prvo izvesti dodjeljivanje vrijednosti %r3->[z] pa tek onda branch-and-link. a ono r%0 i r%3 su greske ili neki neuobicajeni konstrukti?
[ wex-alpha @ 08.10.2004. 22:01 ] @
@Stameni
Znam dobro sta je r-1 kao i r... vec mjesec dana ispirem glavu sa slicnim stvarima. Sto se tice samog komentarisanja, komentar je moj, znaci zelim da shvatim kako program radi u detalj, pa stoga ovu priliku koristim da provjerim da li sam u pravu!
orncc -->Bitwise logical NOR

@Sundance

Ja sam bio u krivu, ovako treba da ide jump and link
Code:


st r%3, [z]         ! pohrani %r3 u varijablu Z 

jmpl %r14 + 4, %r0  ! jump and link (povratak iz subrutine)



%r3 nije greska, nego tu pohranjujem rezultat r sabiranja.

Deklaracija varijabli na kraju mi se cini nekako neobicna...???

[ stameni @ 09.10.2004. 10:02 ] @
Za detaljno razumevanje rada programa, kao što rekoh, obavezna je tabela instrukcija i / ili datasheet.

Code:

orncc -->Bitwise logical NOR


Hm, dobra ideja :) OR-uješ nulom, pa komplementiraš.

Citat:

Deklaracija varijabli na kraju mi se cini nekako neobicna...???


Pogledaj adresne modove tog procesora. Neobično definitivno jeste, ali nije nemoguće da se baš tako radi.
[ Sundance @ 09.10.2004. 23:42 ] @
Mislio sam da li je greska "r%3" umjesto "%r3" ?

Pa kad vec procesor nema podrsku za instrukcije koje racunaju prvi/drugi komplement (dakle NOT/NEG na x86), obicno se radi XOR sa -1 ili NOR sa 0 za invertiranje svih bitova, ili oduzimanje od 0 za drugi komplement. Opet, kazem, ovisno o tome sto procesor podrzava.

Teoretski je moguce SVE logicke operacije emulirati sa NAND ili NOR :) To bi valjda bio neki reducirani RISC :) Obicno se, ovisno o tome koje su logicke operacije dostupne i sa koliko operanada, slaze K-tablica i minimalizira dobiveni izraz, dok u ovakvim (relativno) trivijalnim slucajevima se postupak moze uraditi u glavi.

Ja bih za 2'k koristio:
Code:

subcc %r0, %r1, %r1


A varijable mozes deklarirati bilo gdje, sve dok se ne preklapaju sa izvrsnim kodom. Malo je ruzno staviti ih odmah na pocetak pa skakati na labelu ili petljati sa location counterom, pa je najbolje staviti ih na kraj.