• Nem Talált Eredményt

§* Oio

4. Fejezet

4.1. A cimutasitások módosítása

1. Adjuk össze az 1-től 40-ig terjedő természetes számokat és az összeget tegyük az 5oo-as rekeszbe. Mivel itt 4o összeadásról van szó, célszerű azokat nem külön, di~

rekt módon programozni, hanem ciklikus programmal keres­

ni a megölést. A program menetrendjét a XI. táblán talál­

juk.

Mint látjuk, az f?oo-as rekesz nemcsak a végeredményt, hanem mindenkori részletösszeget is tartalmazza, az

5ol-es rekesz pedig a mindenkori összeadandó ideiglenes tárolására szolgál. Ugyanakkor evvel az összeadandóval végezzük a ciklus-számlálást is. Ha t.i. az 5ol-es re­

kesz tartalma elérte a 4o-et, a program befejeződött /nem szükséges mindig külön számlálórekeszt használni/.

A következőkben nem Írjuk ki az utasítások címeinek tar­

talmát.

A program az 1000-es memóriarekésztől kezdődően:

1000 Á 05 <0> 0500

1001 Á 05 <0>

0501

10Q2 + 00 <1> 0501

1003 + 00 0501 0500

1004 ~ > 11 <40>

0501

1005 FU 34 1002 1006

1006

Megjegyzések:

a. / .A felhasznált konstansok /0, 1, 40/ elmeit szimbolikusan szögletes zárójellel jelöltük. Ez azt jelenti, hogy eze­

ket a konstansokat elvben bármelyik szabad memória-re­

keszben elhelyezhetjük. Konkrét program szerkesztésekor a választott rekeszek cimeit meg kell adni.

b. / Az 1-től 40-ig terjedő természetes számokat /igy tehát a programban szereplő 1 és 40 konstansokat is/ 2 -al szorozva helyezzük el a gép memóriájában. Ez azt jelenti hogy ezek a számok a gépi szavak "jobboldalán” helyez­

kednek el.

Mint látjuk, a fenti feladat programja olyan cikli­

kus program, amelynek utasításai változatlanok, olyan prog­

ram tehát, amelynek tipusával az előző fejezetben foglalkoz­

tunk. Ha azonban a feladatot egy kissé módosítjuk, akkor már tudunk fix utasitásu ciklussal programozni. Legyen az uj feladat a következő: adjunk össze 4o számot, amelyek között

nincs megadva semmilyen összefüggés. Ekkor a 40 összeadandó számot előzetesen a gép memóriájában tárolnunk kell, például a 101-től

150

-ig terjedő rekeszekben /mint ismeretes, a ci- mek 8-as számrendszerben vannak megadva!/. Gyűjtsük az ösz- szeget ismét az 500-as rekeszben. A program kezdetén, mint az előző esetben, most is ki kell üriteni az

500

-as rekeszt /"0-t kell belevinni"/. Ezután az 500-as rekesz tartalmához sorra hozzá kell adni a 101, 102,

...,1 5 0

rekeszek tartal­

mát. A program kezdete a következő lesz:

1000 Á 05 ^o> 0500

1001 + 00 oioi 0500

Ezzel bevittük az első összeadandót a gyüjtőrekesz- be. Ezután szükség -lenne az 1001-es utasításnak még 39-szer történő megismétlésére úgy, hogy első cimének helyén 0101 helyett rendre 0102, 0103, ..., 0150 legyen. Ez azt jelenti:

a program egy szakaszát jelen esetben egyetlen utasítást -nem

-92-kell megismételni, mindene-ismétlés alkalmával módosított formában, Ez a módosítás úgy érhető el, hogy az 1001-es utasitás első ciméhez - minden ismétlés előtt - 1-et adunk hozzá és mindről ..ismétléskor megvizsgáljuk, hogy ez a módosi tott cim elérte-e a 150-et* Utóbbi esetben a program véget ér, ’’kiugrik a ciklusból”.

— 1 Q

A cimmódositás céljára felhas ználjuk a 2 kons­

tanst. Az utasítások első cime ugyanis, mint ismert, a szó 7*“lö* helyértékein helyezkedik el. Ezt a cimet úgy lehet eggyel növelni, ha az utasítást képviselő szóhoz - mint számadathoz -

2~

-at adunk hozzá. Legyen

2~x

az

501

-es rekeszben, azaz: /

501

/= 2"18 és /

502

'= 00 0150

0500

A fenti program folytatása:

1002 + 00

ro 1

H

CD

1001

1005

~ » 11 1001

0502

1004 FU 54 1005 1001

1005

.

Az 1002-es utasitás módosítja az 1001-es utasítást.

Az 1005-as utasitás az 502-es rekeszben tárolt u.n. utasi- táskonstanssal való összehasonlitás által megvizsgálja:

tulhaladta-e már az 1001-es utasitás első cime a 150-et.

Ha nem, akkor az 1004— es feltételes ugró utasitás vissza­

adja a vezérlést az 1001-es utasításra módosított formában megismételteti a ciklust. Ha igen, akkor ugyanez a feltéte­

les ugró utasitás ’’kiugratja” a programot a ciklusból.

A fenti példán láttuk, hogyan történik az utasítá­

sok modositása a ciklusokban. A módszer ugyanaz akkpr is, ha egy ciklusban nem egy, hanem több utasítást kell meg­

változtatni. A példa programja végrehajtja a kitűzött fel­

adatot, de mégis van egy hiányossága, amiért ebben a for­

mában nem lehetne alkalmazni egy valóságos program része­

ként. Ez a hiányosság: lefutása után más alakban marad, mint amelyben eredetileg volt /nevezetesen: az 1001-es

utasítás megváltozott és nem lehet újra felhasználni/.

Az általános ciklusok tárgyalásánál részletesen fogunk foglalkozni azokkal a módszerekkel, amelyekkel ez a probléma megoldható.

Gyakran előfordul, hogy a gép memóriájában tárolt prog­

ramnak különböző részeit kell végrehajtani egy - a konk­

rét számítás kezdetén megadott és a memória meghatáro­

zott rekeszébe bevitt paraméter értékétől függően.

Tekintsük például azt a feladatot, amelyben a program egy bizonyos ponttól kezdve az .

1500

-as,

1510

-es,

1520

-as,

...,

1550

-es utasításnál folytatódik attól függően,

hogy az 500-as rekesz tartalma 0, 1, 2, 5* Az 500-as rekesz tartalma a paraméter. A feladat megoldása: olyan feltétlen ugró utasítást kell szerkeszteni, amelynek ugrócime /az a cime, amely a következő utasítást meg­

adja/:

1500

+

10

. /

0500

/

/

8

-as számrendszerben, a n10"-es tehát 3-at jelent!/

A paraméter 2~^°-cal szorozva szerepel az 500-as rekesz­

ben, mert az ugró utasítás második címének képzéséről .kell gondoskodnunk.

A program a következő:

1000 :, 12 <i) 0500

1001 A-+ 20 0501 1002 Konstans: /0501/ = 7^ 0000 1500

1002 — —

Az 501-es rekeszben lévő konstans u.n. utasítás- konstans, az

1002

-es utasítás felépítésére szolgál.

/Azért nem adtuk, meg ennél az U2 műveleti szimbólumot, mert ez a konstans az

501

-es rekeszben nem kerül utasí­

tásként végrehajtásra, hanem mint számadat szerepel.

Az 1000-es utasítás megszorozza a paramétert

8

-cal

/gépi ”

10

"-zel/, illetve, minthogy

8

nem helyezhető dl a gépben, elosztja g-dal. Az igy kapott számot az

I I ilIMIIIIMi I'III I Ilii i i IIII

-94—

1001-es utasításon szénája az 501-es rekeszben tárolt utasitáskonstanssal és az eredményt - a kész ugró-uta­

sítást elhelyezi az 1002-es rekeszben. Ezután kerül sor az 1002-es rekeszben elhelyezett vezérlés-átadás végre­

hajtására, amely által a program a megadott paraméternek megfelelő részprogramra ugrik át. Az 1002-es utasitás eredetileg nincs kitöltve, eredeti tartalma közömbös.

Itt tehát példát láttunk arra, hogy a program

valamely utasítását - mielőtt végrehajtására sor kerülne - maga a program állítja össze.

A fenti tipusu programrészeket, amelyek egy be­

állítható paramétertől függően különböző elágazásokat valósítanak meg, a blokkdiagramban úgynevezett állít­

ható kapcsolóval jelzik, a XII. tábla első ábrája szerint.

A kapcsoló beállításának /ez példánkban a meg­

felelő paraméter elhelyezése az

500

-as rekezsben/ a szimbóluma pl.:

1 y.

Ez azt jelenti, hogy az -N kapcsoló az 1-es állás­

ba került, a program az ¿L^-el jelölt utón fog folyta­

tódni.

Egy kapcsolóállitást és kapcsolót tartalmazó programrészlet diagramját ábrázoltul?: a XII.tábla máso­

dik részében.

Mátrix-elem elhelyezése a meóriában.

Tegyük fel, hogy egy m x n-es mátrix van a gép memóriájában, úgy, hogy az egyes elemeket az egymásra következő sorok sorrendjében, az 1500-as reksztől kez­

dődő egymásutánirekeszek tároljak.Feladatunk: egy adott számot, közelebbről az

500

-as rekesz tartalmát, az a . • elem számára fenntartott rekeszbe kell elhelyezni.

-95-Az n, i, j számok -2 1^-el megszorozva - mint paraméterek szerepelnek a gép memóriájában. Az uj elem cime:

00

Lf\

1—1

+ n./i-l/ + j-1.

lesz az átviteli utasítás (dime. A program:

1000

11

<a-1 5 ; 0 * 2 /1 ?” 15s-/

1001

xü, 53 (n.2-15)1

1002

32 <2-1 5 >

1003 30 Ó - 2 - 15; n

1004 i~ » 31 r 15;

\

1005

l-x,

33 /

0

-

1

5 X

\r /

1006 4+

20 0501

1007

1007 — —

/utasításkonstans /

0501

/ = 15

0500 1500

/

Az 1002-es és 1005-ös utasítások a részeredmények megfelelő helyérték-eltolását szolgálják. A kiszámított cim értékének

2

~^°-al kell szorozva lennie, mert az átvé­

teli utaeitás második óiméról van szó. Az 1007-es átviteli utasítást maga a program állitja elő. A programban három paraméter /n, i, j/ és egy konstans

/2

^ / szerepel.

4

,

2

. Műveleti utasítások módosítása.

Az utasításokkal való manipuláció nem korlátozódik az utasítás címeinek módosítására, vagy a címek összeállítá­

sára. Minthogy a műveleti jól is számjegykombináció, ezen Ugyanúgy végezhetők aritmetikai műveletek, mint a címeken.

Ilyen esetekben persze figyelembe kell venni a szereplő uta­

sítások konkrét műveleti jeleit /kódjeleit/. Pl.egy számítás folyamán valamely két adott mennyiségnek, az

501

és

502

re­

keszek tartalmának, összegét vagy különbségét kell képezni;

-96-attól függően, hogy egy paraméternek - az

500

-as rekesz tar­

talmának - értéke

0

vagy

2

“^°.

A programrészlet, amellyel ez a feladat megoldható:

1000

: ,

12

<

2

'24>

0500 1001

J/+ 30

1002 1002

1002

+

00 0502 0501

Az 500-as rekeszben tárolt paramétert 24 helyérték­

kel el kell tolni balra /ezt valósitja meg az

1000

-es

utasi-mmOÍL

tás a

2

-el való osztás ál^al/, hogy a műveleti jel meg­

felelő helyértékére, a szó

6

, helyértékére kerüljön. Ha az igy kapott értéket hozzáadjuk az

1002

-es utasításhoz /ezt az

1001

-es utasítás végzi/, úgy az

1002

-es utasítás a paraméter­

től függően változatlan marad, vagy kivonó utasítássá lesz.

Megjegyzések:

a. / Ha az 500-as rekeszben tárolt paraméter-érték 2.2’*^°,

3

.

2

"*^° vagy

6.2

^°, úgy a fenti program az ismertetett módon az

501

-es és

502

-es rekeszekben tárolt számoknak Hányadosát, szorzatát, vagy logikai szorzatát képezi.

b, / Az 500-as rekeszben tárolt paraméter elhelyezhető a szá­

mítás kezdete előtt /ha pl. ugyanazt a programot többféle változatban kívánjuk felhasználni/, de lehetséges, hogy magának az adott számítási programnak előző szakasza számítja ki és helyezi el a paramétert.

A blokkdiagramban a fenti tipusu program-részletet az előzőkben megismert állítható kapcsolóval jelölik, annyi kapcsolóállással, ahány változatot a program ténylegesen megvalósít.

A továbbiakban gyakorló-példákat dolgozunk ki az utasításokkal való különböző manipulációkra.

-97-la Az 500—<as rekeszben tárolt paraméter a következő

8

érté­

ket veheti fel: 0, 2~^°; 2.2“^°,... 7.2~p0. A paraméter értékétől függően adjunk

2

~'*'8-at az 510“es>

511

-es, ...

illetőleg az 517-es rekesz tartalmához. Ez gyakran for­

dul elő olyan esetekben, amikor egy kiszámított eredmény­

től függően valamely rekeszt meg kell jelölni.

A paramétertől függő utasitás a következő +

0 0

<

2

~lö> 051..

A részprogram: 1

1000

+

00 0500 1001

1001

+

00

/

2

“18^

0510

2. Ha az 500»as rekesz tartalma : x < 2 adjunk 2 ^°-at az 510-es rekesz tartalmához. Ha 2 ^

£ x <2.2

adjunk

2

~^°-at az

511

-es rekesz tartalmához sit., ha

7

.

2

"^

4

. x ^*l»

adjunk

2

"^°-at az

517

-es rekesz tartalmához.

A program a következőt

1000

X 03 < £ >

0500 1001

Á 05 <

0

> 0501

1002

+

00

(a'4)

0501

1003 +

00

1006

1004

1 11 0501 0500

1005 FU

34

1006 1002

1006 + 00

\ / 0507

A program az 501-*es rekeszben rendre elhelyezi 2 —4 többszöröseit. Azért nem 2 ^ többszöröseit, mert ez túlcsorduláshoz vezetne. Ennek megfelelően az lQOO-es Utasitás egy helyértékkel jobbra tolja az x számot.

9 8

-Az ,1004-es utasítás végzi el az összehasonlítást

g

és 2"*^

többszörösei között. A program tulajdonképen ismétlődő

ciklus, mellnek utasításai fixek és amely minden ismétlődés­

kor módosítja az 1006-os utasítást /ez kívül van a ciklu­

son/, úgy, hogy végül a. .kívánt rekesz tartalmához adódjék hozzá 2~ .

Ha megengedhető az 500-as rekszben tárolt x szám el­

vesztése /elrontása/, akkor a programi négy utasításból ál­

lítható össze:

1000 + 00

1003

1001 - 01 <2-3>

0500

1002 FU

34 1003

1000

1003 + 00 (2-5°)

0507

Az 1001-es utasítás g -os lépésekkel csökkenti x-et, amíg az negatívvá nem válik. Minden ismétléskor hozzáadódik 1 az 1003-as utasítás második oiméhez.

3. Ha /0500/ =s 0, adjuk össze az 501-es és 502-es rekeszek tartalmát és helyezzük el az összeget az

510

-as rekesz­

ben. Ha /0500/ = 2“^°, akkor végezzük el ugyanezt a műve­

letet a megfelelő mennyiségek abszolút értékén.

Itt nyilvánvalóén a műveleti jel módosításáról lesz szó.

A program:

1000 • > 12 <2‘29>

0500

1001 i'+ 30 1002 1002

1002 + 1 10

0501

0502

1003 VI

24 0510

-99--3o ^

Ha az 500-as rekesz tartalma 2 , úgy az 1002-es

, —1 — 3

utasítás műveleti jeléhez hozzáadódik 2 = 4 . 2 . Az uj műveleti jel

50

lesz, ami a l+l, utasításnak felel meg.

Ha /0500/ ^ o, az 1002-os utasítás változatlan marad.