Kezdőoldal » Számítástechnika » Programozás » Mért így van Assembly-ben?

Mért így van Assembly-ben?

Figyelt kérdés

Már az elején nem értem.


x = y + 1


Mozgassuk y értékét az 1. regiszterbe.

Mozgassuk az 1-es számot a 2. regiszterbe.

Az 1. regisztert adjuk a 2. regiszterhez.

A 2. regisztert mozgassuk az x változóba.


Így gyorsabb szerintem:

Mozgassuk az 1-es számot a 2. regiszterbe.

A 2. regisztert mozgassuk az x változóba.


2022. máj. 27. 19:50
1 2 3 4
 1/34 anonim ***** válasza:
87%
Valóban gyorsabb, csak nem helyes.
2022. máj. 27. 19:51
Hasznos számodra ez a válasz?
 2/34 anonim ***** válasza:
87%
Gyorsabb, csak az eredmény mindig 1 lesz.
2022. máj. 27. 19:57
Hasznos számodra ez a válasz?
 3/34 anonim ***** válasza:
87%
A második "megoldásból" hiányzik az összeadás.
2022. máj. 27. 20:01
Hasznos számodra ez a válasz?
 4/34 anonim ***** válasza:
75%
Ezt most csak valami poénnak szántad igaz?
2022. máj. 27. 20:05
Hasznos számodra ez a válasz?
 5/34 anonim ***** válasza:
21%

Ilyen múvelet, hogy mozgassuk [MOV], csak regiszterek segítségével, azokon keresztül történhet.

A változók a memóriában vannak, de a memória nem aktív eleme a rendszernek. Ha egy memóriacímre írni kell egy értéket, akkor az csak a regisztereken keresztül történhet. A PROCESSZOR regiszterein keresztül.


MOV AX,4

MOV [Y],AX

MOV AX,[Y]

PUSH AX

MOV AX,1

POP BX

ADD AX,BX

MOV [X],AX

2022. máj. 27. 22:11
Hasznos számodra ez a válasz?
 6/34 A kérdező kommentje:

És ez jó?


Adjuk az 1-es számot a 2. regiszterhez.

A 2. regisztert mozgassuk az x változóba.

2022. máj. 27. 22:49
 7/34 anonim ***** válasza:
87%

Ez azért van így, mert a mai gépek szinte kivétel nélkül ún. 1 címes gépek. Ez azt jelenti, hogy egy műveletnél csak 1 memória címre lehet hivatkozni. Ha az adatod a memóriában van (hol másutt lenne) akkor először be kell mozgatni egy regiszterbe, meg a konstanst is, két regiszter között már tud műveletet végezni (itt is érdekes, mert ilyenkor az eredmény az egyik regiszterbe kerül). Majd a regiszterből tudod megint visszamozgatni a memóriában.

Az 1960-as években még léteztek két és három címes gépek. Ezeknél meg lehetett csinálni "egy lépésben" a fenti műveletet. De ezek eltűntek a sülyesztőbe, igazán a hardvert bonyolította el reménytelenül.


Ha pedig 1-et kell hozzá adni valamihez arra általában van egy külön utasítás (INC). És akkor így néz ki a "program" (általános procin):

Mozgasd az Y-t az akkumulátor regiszterbe (MOV)

Növeld 1-el akkumulátor regisztert (INC)

Mozgasd akkumulátort X-be (MOV)

2022. máj. 27. 22:59
Hasznos számodra ez a válasz?
 8/34 anonim ***** válasza:
18%

Nem jó.


Mozgassuk az 1-et (literál) az 1. regiszterbe.

Mozgassuk az 1. regiszter tartalmát [X]-be.


Ahol is az [X] azt a memóriarekeszt jelöli, ami az X változó értékének tárolására van fenntartva.


Az általad írt x = Y+1, így néz ki (ha Y=4):


MOV AX,4 ; a 4 mint számérték bekerül az AX regiszterbe.

MOV [Y],AX ; az AX reg tartalma átkerül az Y változó helyére a memóriában.

MOV AX,[Y] ; Az AX regiszterbe beolvasódik az Y változó értéke a memóból.

PUSH AX ; *Az AX tartalma (ami azonos Y-éval) bekerüla verembe.

MOV AX,1 ; Az AX regiszterbe bekerül az 1 mint számérték.

POP BX ; *A verem tartalma -ami lényegében az Y-, bekerül a BX regiszterbe.

ADD AX,BX ; Az AX reg tartalmához hozzáadódik a BX tartalma.

MOV [X],AX ; Az AX reg tartalma kiíródik az X változó számára fenntartott memóriahelyre.


Ennyi egy összeadás assemblyben. Nevezetesen ez:


y = 4;

x = y+1;



Na, hát, ezért nem kedvelik az assembly-t, mert kicsit körülményesebb a magas szintű nyelveknél.


Olyan meg nincs, hogy az egyik memóriarekesz tartalma hipp-hopp átkerül egy másik rekeszbe.


Adat nem mozoghat csak regiszteren keresztül, teház így:


ADAT MEMO-ból -> REGISZTER-be -> ADAT MEMO-ba


Adat 1 AX regiszterbe (MOV utasítás),

adat 2 BX regiszterbe (MOV utasítás),

művelet (összeadás) végrehajtása (ADD utasítás),

végül a művelet eredménye az AX regiszterben tárolódik. Onnan kerül vissza a memóriába egy újabb MOV utasítással.


* a forráskódban azért van (push, pop) mert az általam tervezett két munka-regiszteres processzor így oldja meg az adat mozgatását procin belül, mivel így minden sokkal egyszerűbb. Kevesebb a drót és kevesebb az utasítás is.

2022. máj. 27. 23:22
Hasznos számodra ez a válasz?
 9/34 anonim ***** válasza:
78%

5/8 2022.05.27 22:11: Minek ide a PUSH és a POP? Ez milyen proci? Mert ennyire elbonyolított jószágot nem láttam.


Nézzük a jól ismert Z80 (elég elterjedt 8 bites proci):


LD A,(YY) - Ahol (YY) az Y változó címe

INC A - (növeld 1-el A-t, a feladatban konstans +1 szerepel)

LD (XX),A - Másold A-t XX címre (ez az X változó címe).


Ez a kód működni fog.


Ha nem 1-et kell hozzá adni:


LD A,(YY)

LD B,konstans (ezzel kell növelni az Y-t)

ADD A,B

LD (XX),A


Feladat letudva.


Ugyanaz pl. PIC mikrokontrolleren (belső memóriába van az adat)


INCF YY,W YY megint a cím ahol az adat van, Ez egy elég sajátos utasítása a PIC-nek, mert ez növeli a kijeölt címen lévő értéket 1-el az eredményt a W regiszterbe teszi (Work regiszter, gyakorlatilag az akkumulátor)

MOVWF XX XX a cím ahova az eredményt kell tenni.


Ugyanez ha nem 1-el kell növelni:


MOVLW konstans

ADDWF YY,W (add hozzá a kijelölt címen lévő értékhez W értékét, az eredményt tedd W-be)

MOVWF XX W értékét másold XX címre


(itt sincs PUSH és a feladat megoldva)


Nézzük x86-on


MOV EAX,YY (másold EAX regiszterbe az YY címen lévő adatot)

INC EAX

MOV XX,EAX (másold EAX értékét XX címre).


vagy


MOV EAX,YY

MOV EBX,konstans

ADD EAX,EBX

MOV XX,EAX


Push sehol nincs benne. És mindegyik kódrészlet működik.

2022. máj. 27. 23:45
Hasznos számodra ez a válasz?
 10/34 anonim ***** válasza:
0%

Nincs elbonyolítva semmi. Sőt, egyszerűsítve van. Leírtam a *-ozott részben, éppen a magadfajtáknak, mert a kérdező nyilván még nem tart itt. A kérdésre viszont számítottam, a stack miatt.


Az egész egy szimpla, két regiszteres cpu. Olyan, aminél csak az egyik regiszter (AX) teremt kapcsolatot a memóriával, a másik (BX) regiszterbe adatot juttatni csak indirekt módon lehet.

Az adat cirkulál. Előbb az AX-be érkezik, onnan push a verembe, majd a veremből pop a BX-be. Mivel veremre mindenképpen szükség van, így lett megvalósítva. Ezzel néhány MOV utasítás és architekturális elem meg lett spórolva.

Ebben a prociban minden aritmetikai és logikai művelet így dolgozik, amelyik egynél több operandust igényel.

Az egyik operandus megy a memóriából az AX-be, onnan push verembe, majd pop BX-be. A másik operandus a memóból az AX-be és jöhet is a művelet. Az eredményt minden esetben az AX tartalmazza.

2022. máj. 28. 01:02
Hasznos számodra ez a válasz?
1 2 3 4

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!