» »

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č! ;)

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

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 ?

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

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

boogie_xlr ::

Narediš isto ko za 8 bitno in rečeš da je to 16 bitna arhitektura.
:D


Vredno ogleda ...

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

Assembler razumevanje programa

Oddelek: Programiranje
72017 (908) BivšiUser2
»

dekodiranje ukazov

Oddelek: Programiranje
111068 (841) kihc
»

iz binarne vrednosti v string

Oddelek: Programiranje
161847 (1482) Ktj
»

Nekaj splošnih vprašanj s področja HW

Oddelek: Strojna oprema
131804 (1565) P1P1
»

[C++] Shift left (strani: 1 2 )

Oddelek: Programiranje
663536 (3039) Thomas

Več podobnih tem