» »

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...
  • 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.

Zgodovina sprememb…

  • spremenil: jernejl ()

Spura ::

lebdim je izjavil:

ž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?
Resno? Teh ukazov ne znas v eno bogo zanko k isce max skombinirat?

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?

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č.
"Life is hard; it's even harder when you're stupid."

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 je izjavil:

Mal offtopic

Ampak na katerem faksu še težijo z zbirnikom. Kot mi je znano, še na FRI ne več.

5 let nazaj se je to se ucilo na FEju (verjetno se tudi se zdaj). Pa ne bi rekel, da je bilo za brezveze.

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.
"Life is hard; it's even harder when you're stupid."

http://goo.gl/2YuS2x

AndrejO ::

Invictus je izjavil:

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."

mn ::

Invictus je izjavil:

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 ::

mn je izjavil:


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

AndrejO ::

jype je izjavil:

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 ::

AndrejO je izjavil:


Š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

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.

Spura ::

Invictus je izjavil:

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.

Invictus je izjavil:


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:

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?

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 ?


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

program v zbirniku

Oddelek: Programiranje
111134 (705) Senitel
»

Zbirni jezik - Seštevek dveh šestnajst bitnih števil

Oddelek: Programiranje
5941 (823) boogie_xlr
»

Programiranje v zbirniku - potrebujem pomoč

Oddelek: Programiranje
51706 (1643) St@jler
»

Zbirnik!

Oddelek: Programiranje
81718 (1453) Gundolf
»

Zbirnik-program

Oddelek: Programiranje
162129 (2035) Bockor

Več podobnih tem