Forum » Programiranje » Zbirni jezik - Seštevek dveh šestnajst bitnih števil
Zbirni jezik - Seštevek dveh šestnajst bitnih števil
golobich ::
Pozdravljeni!
V šoli imamo pri predmetu RKO (računalniške komponente) programiranje v zbirnem jeziku. Ponavadi smo delali primere kako sešteti dve 8 bitni števili,... . Zadnjič je pa nekoga vprašala za oceno in je moral napisat program ki bi seštel 2 16-bitni števili. Meni se baš ne sanja kako bi to rešili. Ok če bi blo 8 bitno število to nebi blo problem. Naložili bi naprimer v akumulator A število iz določenega naslova in ga sešteli z številom na drugem naslovu, vse skupi pa shranili na tretji naslov. Ampak za 16-bitna števila se mi pa res ne sanja. Ima mogoče kdo kak predlog?
Lp Golobič! ;)
V šoli imamo pri predmetu RKO (računalniške komponente) programiranje v zbirnem jeziku. Ponavadi smo delali primere kako sešteti dve 8 bitni števili,... . Zadnjič je pa nekoga vprašala za oceno in je moral napisat program ki bi seštel 2 16-bitni števili. Meni se baš ne sanja kako bi to rešili. Ok če bi blo 8 bitno število to nebi blo problem. Naložili bi naprimer v akumulator A število iz določenega naslova in ga sešteli z številom na drugem naslovu, vse skupi pa shranili na tretji naslov. Ampak za 16-bitna števila se mi pa res ne sanja. Ima mogoče kdo kak predlog?
Lp Golobič! ;)
robinson33 ::
Najprej sešteješ oba spodnja dela dveh 16 bitnih števil (LSB). Uporabiš ukaz recimo ADD. Rezultat shraniš, kot si rekel, na tretji naslov. Hkrati pa se ti postavi tudi Carry zastavica, če je vsota večja od 255.
Potem pa ločeno sešteješ še zgornja dela števil (MSB), le da tokrat uporabiš ukaz, ki prišteje še Carry zastavico. Recimo ADC. Rezultat shraniš na četrti naslov.
Tako ti četrti in tretji naslov predstavljata rezultat (višji in nižji del), hkrati pa spet pogledaš Carry zastavico in če je postavljena, moraš čisto spredaj postaviti še enico. Torej peti naslov, na katerem postaviš ali pa ne bit 0 (najbolj "desni").
Potem pa ločeno sešteješ še zgornja dela števil (MSB), le da tokrat uporabiš ukaz, ki prišteje še Carry zastavico. Recimo ADC. Rezultat shraniš na četrti naslov.
Tako ti četrti in tretji naslov predstavljata rezultat (višji in nižji del), hkrati pa spet pogledaš Carry zastavico in če je postavljena, moraš čisto spredaj postaviti še enico. Torej peti naslov, na katerem postaviš ali pa ne bit 0 (najbolj "desni").
golobich ::
LSB in MSB? To prvič slišim :o
Pa gledam tudi ukaze na listu ki smo ga v šoli dobili pa ta dva ukaza sploh nista napisana.
Ok. Drugače ta dva ukaza ne zastopim. Drugače pa, praviš na morem 16 bitno število razbit na dva dela in pole CC postavim na 1 če je vsota spodnjih delov 2 števil > 255.
In zdej seštejem še zgornja dela in prištejem še CC.
In potem enostavno seštejem rezultat zgornjega dela in spodnjega dela in prištejem(?) CC ?
Pa gledam tudi ukaze na listu ki smo ga v šoli dobili pa ta dva ukaza sploh nista napisana.
Ok. Drugače ta dva ukaza ne zastopim. Drugače pa, praviš na morem 16 bitno število razbit na dva dela in pole CC postavim na 1 če je vsota spodnjih delov 2 števil > 255.
In zdej seštejem še zgornja dela in prištejem še CC.
In potem enostavno seštejem rezultat zgornjega dela in spodnjega dela in prištejem(?) CC ?
robinson33 ::
LSB = least significant bit/byte, desni del števila
MSB = most significant bit/byte, levi del števila
To nista ukaza.
Ob vsakem sestevanju se CC postavi avtomatsko. Če ni prenosa (sestevek manjši ali enak 255), bo CC=0, če je prenos, bo CC=1. To velja za oba ukaza ADD in ADC. Različni procesorji imajo lahko drugačen dialekt in se istopomenska ukaza označujeta tudi drugače.
Ukaz ADD je seštevanje brez upoštevanja predhodnega CC. Na primer 'ADD A,mem' akumulatorju prišteje vsebino lokacije mem in nič drugega. Ukaz 'ADC A,mem' (add with carry) pa vsoti prišteje še 1, če je CC=1.
Torej enako kot seštevanje peš: seštej spodnji (desni) del števil z ukazom ADD, potem pa še levi del z ukazom ADC, ker moraš upoštevati tudi CC prenos.
No, šlo bi tudi obakrat z ukazom ADD, le da bi drugič najprej preveril pogoj, kakšen je CC. Če je postavljen, bi najprej enemu od zgornjih 'podštevil' prištel 1, potem pa tej vsoti še drugo 'podštevilo'.
MSB = most significant bit/byte, levi del števila
To nista ukaza.
Ob vsakem sestevanju se CC postavi avtomatsko. Če ni prenosa (sestevek manjši ali enak 255), bo CC=0, če je prenos, bo CC=1. To velja za oba ukaza ADD in ADC. Različni procesorji imajo lahko drugačen dialekt in se istopomenska ukaza označujeta tudi drugače.
Ukaz ADD je seštevanje brez upoštevanja predhodnega CC. Na primer 'ADD A,mem' akumulatorju prišteje vsebino lokacije mem in nič drugega. Ukaz 'ADC A,mem' (add with carry) pa vsoti prišteje še 1, če je CC=1.
Torej enako kot seštevanje peš: seštej spodnji (desni) del števil z ukazom ADD, potem pa še levi del z ukazom ADC, ker moraš upoštevati tudi CC prenos.
No, šlo bi tudi obakrat z ukazom ADD, le da bi drugič najprej preveril pogoj, kakšen je CC. Če je postavljen, bi najprej enemu od zgornjih 'podštevil' prištel 1, potem pa tej vsoti še drugo 'podštevilo'.
MrBrdo ::
lah bi recimo tud povedal kera arhitektura je sploh... programiranje v zbirniku je nekako tako kot da bi rekel programiranje v programskem jeziku.
MrBrdo
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Assembler razumevanje programaOddelek: Programiranje | 2017 (908) | BivšiUser2 |
» | dekodiranje ukazovOddelek: Programiranje | 1068 (841) | kihc |
» | iz binarne vrednosti v stringOddelek: Programiranje | 1847 (1482) | Ktj |
» | Nekaj splošnih vprašanj s področja HWOddelek: Strojna oprema | 1804 (1565) | P1P1 |
» | [C++] Shift left (strani: 1 2 )Oddelek: Programiranje | 3536 (3039) | Thomas |