Forum » Programiranje » programiranje v zbirniku z ukazi ...
programiranje v zbirniku z ukazi ...
lebdim ::
živjo, pomagam eni sosedi pri predmetu UVR (uvod v računalništvo) in učijo se tudi programiranje v zbirniku z naslednjimi ukazi:
LDA N - v akumulator naloži število iz naslova N
LDA #N - v akumulator naloži število N
STA N - število v akumulatorju zapiše na naslov N
ADA N - v akumulator prišteje število iz naslova N
ADA #N - v akumulator prišteje število N
SBA N - od akumulatorja odšteje število iz naslova N
SBA #N - od akumulatorja odšteje število N
JMP N - program skoči na ukaz na naslov N
JZE N - do skoka na naslovu N pride, če je v akumulatorju 0
JNZ N - do skoka na naslovu N pride, če v akumulatorju ni 0
JMI N - do skoka na naslovu N pride, če je v akumulatorju negativno število
JPL N - do skoka na naslovu N pride, če v akumulatorju ni negativno število
JCS N - do skoka na naslovu N pride, če je pri zadnji aritmetični operaciji prišlo do preliva nepredznačenih števil
JVS N - do skoka na naslovu N pride, če je pri zadnji aritmetični operaciji prišlo do preliva predznačenih števil
STOP N - program se ustavi
torej, ti ukazi so možni. imam pa nekaj nalogc, katerih vem okvirno rešitev npr. v pascalu, ne vem pa čisto točno, kako bi jih realiziral v zbirniku.
NALOGCE:
1. Napišite program v zbirniku, ki bo iz počasne vhodne naprave prebral 100 števil, in na počasno izhodno napravo izpisal največjega izmed prebranih števil. (če bi bil to program v pascalu, bi shranjeval v tabelo, in poiskal največjega in izpisal. kako bom pa tukaj izvedel zanko točno 100x? kako naj izvedem, da se primerja z dosedanjim maksimalnim elementom?
2. Dobili smo dve zelo počasni izhodni napravi. Radi bi ugotovili, katera izmed njih je hitrejša. Napišite program v zbirniku, ki bo hkrati na obe napravi poskušal zapisati 100 poljubnih števil. Če jih bo prej zapisal na prvo napravo, naj na lokacijo 100 zapiše 1, če pa jih bo prej zapisal na drugo napravo, pa naj na lokacijo 100 zapiše 2. (ok, tukaj mora bit inicializacija dveh izhodnih naprav, branje stotih števil, zapisovanje na obe napravi. kako preverim, katera je hitrejša - kako preverim, če je prej izpisalo na prvo oz. drugo napravo?)
3. Napišite program v zbirniku, ki se bo ustavil takoj po tem, ko bo na počasno izhodno napravo zapisal deset tisoč enk, deset tisoč dvojk, deset tisoč trojk, ..., in deset tisoč stotic (z drugimi besedami, vsa števila od 1 do 100 mora program deset tisočkrat zapisati na počasno izhodno napravo).
prosim za malo pomoči ali razlage pri vsaki nalogci...
LDA N - v akumulator naloži število iz naslova N
LDA #N - v akumulator naloži število N
STA N - število v akumulatorju zapiše na naslov N
ADA N - v akumulator prišteje število iz naslova N
ADA #N - v akumulator prišteje število N
SBA N - od akumulatorja odšteje število iz naslova N
SBA #N - od akumulatorja odšteje število N
JMP N - program skoči na ukaz na naslov N
JZE N - do skoka na naslovu N pride, če je v akumulatorju 0
JNZ N - do skoka na naslovu N pride, če v akumulatorju ni 0
JMI N - do skoka na naslovu N pride, če je v akumulatorju negativno število
JPL N - do skoka na naslovu N pride, če v akumulatorju ni negativno število
JCS N - do skoka na naslovu N pride, če je pri zadnji aritmetični operaciji prišlo do preliva nepredznačenih števil
JVS N - do skoka na naslovu N pride, če je pri zadnji aritmetični operaciji prišlo do preliva predznačenih števil
STOP N - program se ustavi
torej, ti ukazi so možni. imam pa nekaj nalogc, katerih vem okvirno rešitev npr. v pascalu, ne vem pa čisto točno, kako bi jih realiziral v zbirniku.
NALOGCE:
1. Napišite program v zbirniku, ki bo iz počasne vhodne naprave prebral 100 števil, in na počasno izhodno napravo izpisal največjega izmed prebranih števil. (če bi bil to program v pascalu, bi shranjeval v tabelo, in poiskal največjega in izpisal. kako bom pa tukaj izvedel zanko točno 100x? kako naj izvedem, da se primerja z dosedanjim maksimalnim elementom?
2. Dobili smo dve zelo počasni izhodni napravi. Radi bi ugotovili, katera izmed njih je hitrejša. Napišite program v zbirniku, ki bo hkrati na obe napravi poskušal zapisati 100 poljubnih števil. Če jih bo prej zapisal na prvo napravo, naj na lokacijo 100 zapiše 1, če pa jih bo prej zapisal na drugo napravo, pa naj na lokacijo 100 zapiše 2. (ok, tukaj mora bit inicializacija dveh izhodnih naprav, branje stotih števil, zapisovanje na obe napravi. kako preverim, katera je hitrejša - kako preverim, če je prej izpisalo na prvo oz. drugo napravo?)
3. Napišite program v zbirniku, ki se bo ustavil takoj po tem, ko bo na počasno izhodno napravo zapisal deset tisoč enk, deset tisoč dvojk, deset tisoč trojk, ..., in deset tisoč stotic (z drugimi besedami, vsa števila od 1 do 100 mora program deset tisočkrat zapisati na počasno izhodno napravo).
prosim za malo pomoči ali razlage pri vsaki nalogci...
- poskusil klonirati: lebdim ()
jernejl ::
Običajno je treba še kaj povedati o arhitekturi procesorja in o počasnih vhodnih/izhodnih napravah, da bi lahko znali napisati program (najbrž te naprave berejo/pišejo z določenih naslovov in na določene naslove pošiljajo status branja/pisanja).
Glede zanke je pa tako: na nek naslov zapišeš vrednost 100, potem pa pred vsako ponovitvijo zanke ta naslov naložiš v akumulator, odšteješ 1, zapišeš nazaj na isti naslov, potem pa v primeru neničelne vrednosti izvajanje vrneš na začetek zanke (z JNZ).
Pri tretji nalogi bi znal biti catch v tem, da gre za 8-bitni procesor in bo treba število deset tisoč "pridelati" iz dveh 8-bitnih vrednosti.
Glede zanke je pa tako: na nek naslov zapišeš vrednost 100, potem pa pred vsako ponovitvijo zanke ta naslov naložiš v akumulator, odšteješ 1, zapišeš nazaj na isti naslov, potem pa v primeru neničelne vrednosti izvajanje vrneš na začetek zanke (z JNZ).
Pri tretji nalogi bi znal biti catch v tem, da gre za 8-bitni procesor in bo treba število deset tisoč "pridelati" iz dveh 8-bitnih vrednosti.
Zgodovina sprememb…
- spremenil: jernejl ()
Spura ::
živjo, pomagam eni sosedi pri predmetu UVR (uvod v računalništvo) in učijo se tudi programiranje v zbirniku z naslednjimi ukazi:Resno? Teh ukazov ne znas v eno bogo zanko k isce max skombinirat?
LDA N - v akumulator naloži število iz naslova N
LDA #N - v akumulator naloži število N
STA N - število v akumulatorju zapiše na naslov N
ADA N - v akumulator prišteje število iz naslova N
ADA #N - v akumulator prišteje število N
SBA N - od akumulatorja odšteje število iz naslova N
SBA #N - od akumulatorja odšteje število N
JMP N - program skoči na ukaz na naslov N
JZE N - do skoka na naslovu N pride, če je v akumulatorju 0
JNZ N - do skoka na naslovu N pride, če v akumulatorju ni 0
JMI N - do skoka na naslovu N pride, če je v akumulatorju negativno število
JPL N - do skoka na naslovu N pride, če v akumulatorju ni negativno število
JCS N - do skoka na naslovu N pride, če je pri zadnji aritmetični operaciji prišlo do preliva nepredznačenih števil
JVS N - do skoka na naslovu N pride, če je pri zadnji aritmetični operaciji prišlo do preliva predznačenih števil
STOP N - program se ustavi
torej, ti ukazi so možni. imam pa nekaj nalogc, katerih vem okvirno rešitev npr. v pascalu, ne vem pa čisto točno, kako bi jih realiziral v zbirniku.
NALOGCE:
1. Napišite program v zbirniku, ki bo iz počasne vhodne naprave prebral 100 števil, in na počasno izhodno napravo izpisal največjega izmed prebranih števil. (če bi bil to program v pascalu, bi shranjeval v tabelo, in poiskal največjega in izpisal. kako bom pa tukaj izvedel zanko točno 100x? kako naj izvedem, da se primerja z dosedanjim maksimalnim elementom?
lebdim ::
fora je v tem, da sem to že znal pred 5 leti, ko sem opravljal ta izpit, zdaj pa sem že nekoliko pozabil. saj sem napisal okvirno idejo: v programskem jeziku bi števila shranjeval v tabeli, prvo število postavil za maksimalnega, potem pa od drugega števila naprej pa do stotega preverjal, če je kateri izmed njih večji in tistega postavil za maksimalnega ter ga na koncu vrnil.
pri zbirniku pa bi naredil takole:
- inicializiral bi vhodno in izhodno napravo za branje števil
- inicializiral bi števec števil (do 100) - zanka
- vsako število bi še shranil na neko drugo pomnilniško lokacijo v pomnilniku
- z odštevanjem dveh zaporednih števil bi preverjal, katero izmed njih je večje
je ideja v redu? edino kako bi realiziral, da se potem vsa števila med seboj primerjajo?
pri zbirniku pa bi naredil takole:
- inicializiral bi vhodno in izhodno napravo za branje števil
- inicializiral bi števec števil (do 100) - zanka
- vsako število bi še shranil na neko drugo pomnilniško lokacijo v pomnilniku
- z odštevanjem dveh zaporednih števil bi preverjal, katero izmed njih je večje
je ideja v redu? edino kako bi realiziral, da se potem vsa števila med seboj primerjajo?
Smurf ::
Ce rabis samo najvecje stevilo, ne rabis shranjevati 100 vrednosti, ne v programskem jeziku, ne v zbirniku. Rabis samo trenutno najvecjega.
Invictus ::
Mal offtopic
Ampak na katerem faksu še težijo z zbirnikom. Kot mi je znano, še na FRI ne več.
Ampak na katerem faksu še težijo z zbirnikom. Kot mi je znano, še na FRI ne več.
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
smoke ::
Invictus, na FERI (program Računalništvo in informacijske tehnologije) . In sicer z x86. Čeprav temu ne bi ravno rekel "teženje".
Smurf ::
Invictus ::
Ja, pa je teženje. Ti fosilni profesorji naj raje naredijo program, ki je primeren za današnje čase. Ne pa da drkajo folk z neuporabnimi zadevami.
V zbirniku programira recimo 0,1 promila ljudi, ali pa še manj. Gre za ponavadi zelo specifične zadeve v embedded svetu. Pazi, zelo specifične. Ostalo (99,9999% kode)je napisano v C in C++. Imam kar nekaj znancev, ki programirajo v tem svetu, pa niso zbirnika povohali zadnjih 10 let. So prevajalniki za C in C++ dovolj učinkoviti.
V zbirniku programira recimo 0,1 promila ljudi, ali pa še manj. Gre za ponavadi zelo specifične zadeve v embedded svetu. Pazi, zelo specifične. Ostalo (99,9999% kode)je napisano v C in C++. Imam kar nekaj znancev, ki programirajo v tem svetu, pa niso zbirnika povohali zadnjih 10 let. So prevajalniki za C in C++ dovolj učinkoviti.
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
AndrejO ::
Mal offtopic
Ampak na katerem faksu še težijo z zbirnikom. Kot mi je znano, še na FRI ne več.
FRI je nekaj let nazaj to zagotovo še počel, če si to izbral. Kolikor vem, si ga lahko izbereš tudi na UC Berekely in verjetno še marsikje drugje.
Zakaj bi to bilo teženje?
Zgodovina sprememb…
- spremenil: AndrejO ()
jype ::
AndrejO> Zakaj bi to bilo teženje?
Ker je danes koristno, da si programer sploh ne predstavlja, kako se njegovo programiranje prevede v strojno kodo in kako se ta izvaja na računalnikih. Ta najboljši niti ne vedo, da strojna koda obstaja.
"A loh več rama dodate, na mojm računalniku je čist ok delal."
Ker je danes koristno, da si programer sploh ne predstavlja, kako se njegovo programiranje prevede v strojno kodo in kako se ta izvaja na računalnikih. Ta najboljši niti ne vedo, da strojna koda obstaja.
"A loh več rama dodate, na mojm računalniku je čist ok delal."
mn ::
Ja, pa je teženje. Ti fosilni profesorji naj raje naredijo program, ki je primeren za današnje čase. Ne pa da drkajo folk z neuporabnimi zadevami.
V zbirniku programira recimo 0,1 promila ljudi, ali pa še manj. Gre za ponavadi zelo specifične zadeve v embedded svetu. Pazi, zelo specifične. Ostalo (99,9999% kode)je napisano v C in C++. Imam kar nekaj znancev, ki programirajo v tem svetu, pa niso zbirnika povohali zadnjih 10 let. So prevajalniki za C in C++ dovolj učinkoviti.
Niti pod razno ni teženje. Vsak kompetenten developer bi moral vsaj razumeti kako delajo stvari na tem nivoju. Tudi če nikoli ne programira v assemblerju.
Invictus ::
Niti pod razno ni teženje. Vsak kompetenten developer bi moral vsaj razumeti kako delajo stvari na tem nivoju. Tudi če nikoli ne programira v assemblerju.
Seveda.
Da zgubi pol leta za učenje nečesa česar nikoli ne bo rabil. Res koristno. Poleg tega si znanje zbirnika nič ne pomaga pri tem kako dela CPU. Večina developerjev je pa tako ali tako srečna če jim tista napisana koda sploh deluje. In rečejo stranki naj kupi hitrejše škatle, če dela prepočasi. Je ceneje kot plačevati ure inženirjev za optimizacijo.
Razen seveda če drugače ne gre. AMpak teh problemov je 0,1% v svetu ...
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
AndrejO ::
AndrejO> Zakaj bi to bilo teženje?
Ker je danes koristno, da si programer sploh ne predstavlja, kako se njegovo programiranje prevede v strojno kodo in kako se ta izvaja na računalnikih. Ta najboljši niti ne vedo, da strojna koda obstaja.
"A loh več rama dodate, na mojm računalniku je čist ok delal."
Svet ima veliko različnih izzivov in nekateri izmed njih zahtevajo tudi dobro poznavanje konkretne arhitekture. Da pa sploh imaš kakšno možnost današnjo tehniko razumeti, moraš začeti na začetku.
Še obvezna avtomobilistična primerjava: večina voznikov F1 je začela v gokartu.
galu ::
Zmožnost prepoznavanja sarkazma tudi ni odveč, pa nima veze, če si programer ali ne.
Tako to gre.
Invictus ::
Še obvezna avtomobilistična primerjava: večina voznikov F1 je začela v gokartu.
Zaradi preprostega dejstva da je to mulariji edino dostopno dirkalno vozilo.
Pri programiranju ti je na voljo vse od začetka, ne samo zbirnik ...
Zakaj se ne bi samo Jave naučil? Ali pythona? Ali perla? Dela je dovolj za specializirane programerje.
In učenje zbirnika tukaj pripomore samo k kravžljanju možganov in izgubi časa. Možgane si lahko kravžljaš tudi v kakem bolj normalnem jeziku.
"Life is hard; it's even harder when you're stupid."
http://goo.gl/2YuS2x
http://goo.gl/2YuS2x
jype ::
Invictus> Zakaj se ne bi samo Jave naučil? Ali pythona? Ali perla? Dela je dovolj za specializirane programerje.
Zato, ker če uporabiš Java HashMap ali Python dictionary, pa ne veš kaj je Fenwick tree, ne moreš razumet, zakaj tvoja rešitev deluje znatno počasneje od konkurence.
Zato, ker če uporabiš Java HashMap ali Python dictionary, pa ne veš kaj je Fenwick tree, ne moreš razumet, zakaj tvoja rešitev deluje znatno počasneje od konkurence.
Spura ::
Ja, pa je teženje. Ti fosilni profesorji naj raje naredijo program, ki je primeren za današnje čase. Ne pa da drkajo folk z neuporabnimi zadevami.
V zbirniku programira recimo 0,1 promila ljudi, ali pa še manj. Gre za ponavadi zelo specifične zadeve v embedded svetu. Pazi, zelo specifične. Ostalo (99,9999% kode)je napisano v C in C++. Imam kar nekaj znancev, ki programirajo v tem svetu, pa niso zbirnika povohali zadnjih 10 let. So prevajalniki za C in C++ dovolj učinkoviti.
Zato ker je dobr imet predstavo kako zgleda en loop v strojni kodi in kako procesor deluje. Sploh pa ce delas embedded kodo. Seveda programiras pol v C.
Da zgubi pol leta za učenje nečesa česar nikoli ne bo rabil. Res koristno.
Lol kera anti-intelektualna pozicija, znanje da ima vrednost samo ko ga uporabljas.
Zgodovina sprememb…
- spremenil: Spura ()
hojnikb ::
Dosti nabijanja, nikjer pa nobene pametne rešitve.
Če me ne spomin ne vara (meli isto na PEFu) je treba samo vedet notacijo, kako počasna prebere neko stvar in jo potem zapiše, ko je pogoj izpolnjen.
Ena podobna naloga iz stare skripte:
Če me ne spomin ne vara (meli isto na PEFu) je treba samo vedet notacijo, kako počasna prebere neko stvar in jo potem zapiše, ko je pogoj izpolnjen.
Ena podobna naloga iz stare skripte:
Napišite program, ki iz počasne vhodne naprave prebere 100 število in na mesto
zapiše, koliko izmed njih je bilo negativnih.
0 LDA #0
2 STA 252 //V. naprava
4 STA 150 //init 150
6 LDA #100
8 STA 120 //začasna
10 LDA 252 //BERI ŠT.
12 JPL 10
14 LDA 253
16 JPL 24 //na beri 1 manj
18 LDA 150 //+ 1 NEG
20 ADA #1
22 STA 150
24 LDA 120 //BERI 1 MANJ
26 SBA #1
28 STA 120
30 JPL 10 //če jih še ni 100, beri
št.
32 STOP n
#brezpodpisa
lebdim ::
tista soseda potem januarja žal ni naredila, je pisala 45% in mora it še enkrat junija. poslala mi je znova eno nalogo.
NALOGA: V zbirnem jeziku napiši program (spet isti ukazi kot zgoraj), ki na lokacijo M151 zapiše M150-potenco števila 2, torej število 2M150. Če je npr. M150 = 3, potem mora biti na lokaciji M151 zapisano 23 = 8.
Moja okvirna ideja bi bila: (nisem čisto ziher, zato vprašam)
- najprej pogledaš, če je na lokaciji M150 = 0, torej, če je 20, ker to je potem rezultat 1 in je konec.
- v nasprotnem primeru pa v bistvu: 2n = 2 * 2n-1 = 2n-1 + 2n-1; in potem iz lokacije M150 odštevaš dokler ne dobiš 0, in za vsako tako seštevanje prišteješ na lokacijo M151?
Imam prav? Bi tako potenciranje izrazil s seštevanjem? Na lokaciji M150 bi bil potem števec, dokler ne pride do 0. Je prav?
NALOGA: V zbirnem jeziku napiši program (spet isti ukazi kot zgoraj), ki na lokacijo M151 zapiše M150-potenco števila 2, torej število 2M150. Če je npr. M150 = 3, potem mora biti na lokaciji M151 zapisano 23 = 8.
Moja okvirna ideja bi bila: (nisem čisto ziher, zato vprašam)
- najprej pogledaš, če je na lokaciji M150 = 0, torej, če je 20, ker to je potem rezultat 1 in je konec.
- v nasprotnem primeru pa v bistvu: 2n = 2 * 2n-1 = 2n-1 + 2n-1; in potem iz lokacije M150 odštevaš dokler ne dobiš 0, in za vsako tako seštevanje prišteješ na lokacijo M151?
Imam prav? Bi tako potenciranje izrazil s seštevanjem? Na lokaciji M150 bi bil potem števec, dokler ne pride do 0. Je prav?
Zgodovina sprememb…
- spremenil: lebdim ()
lebdim ::
Moja okvirna rešitev:
0 LDA #1
2 STA 151
4 LDA 150
6 JZE 22
8 LDA 151
10 ADA 151
12 STA 151
14 LDA 150
16 SBA #1
18 STA 150
20 JMP 4
22 STOP
bi bilo kul to? še kakšna druga varianta ?
0 LDA #1
2 STA 151
4 LDA 150
6 JZE 22
8 LDA 151
10 ADA 151
12 STA 151
14 LDA 150
16 SBA #1
18 STA 150
20 JMP 4
22 STOP
bi bilo kul to? še kakšna druga varianta ?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | program v zbirnikuOddelek: Programiranje | 1135 (706) | Senitel |
» | Zbirni jezik - Seštevek dveh šestnajst bitnih številOddelek: Programiranje | 941 (823) | boogie_xlr |
» | Programiranje v zbirniku - potrebujem pomočOddelek: Programiranje | 1706 (1643) | St@jler |
» | Zbirnik!Oddelek: Programiranje | 1718 (1453) | Gundolf |
» | Zbirnik-programOddelek: Programiranje | 2129 (2035) | Bockor |