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
 11/34 anonim ***** válasza:
0%

Ehelyett:


01 MOV AX,4

02 MOV [Y],AX

03 MOV AX,[Y]

04 PUSH AX

05 MOV AX,1

06 POP BX

07 ADD AX,BX

08 MOV [X],AX


lehet ez is:


01 MOV AX,4

02 MOV [Y],AX

03 ---------

04 PUSH AX

05 MOV AX,1

06 POP BX

07 ADD AX,BX

08 MOV [X],AX


mivel a harmadik sor csak fölösleges adatmozgatás, de logikailag mégis a fentebbi, első kód helyes. A fölös sort az assembler optimalizáló rutinjai természetesen kidobják.

2022. máj. 28. 01:13
Hasznos számodra ez a válasz?
 12/34 anonim ***** válasza:
5%

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


Az enyém is, effelől nyugodt lehetsz.

2022. máj. 28. 01:26
Hasznos számodra ez a válasz?
 13/34 anonim ***** válasza:
77%
Egy pipás Delphi papával nem kell foglalkozni, el sem kell olvasni a kommentjeit, nyugodtan tegyetek úgy, mintha nem is létezne.
2022. máj. 28. 08:06
Hasznos számodra ez a válasz?
 14/34 anonim ***** válasza:
71%

10. Válasz 2022.05.28 01:02.


Bocs de ez valami elméletben létező proci? Mert én ilyennel még nem találkoztam. De az elvet sem értem. Ez valami totális zűrzavar. Ha a vermet eléri bármelyik regiszter miért nem éri el a memóriát? Semmi értelme ennek igy.


Jelen helyzetben csak a kérdező össze zavarására jó. Eleve az assemblyk eltérōek de egyetlen egy ennyire buta procit még nem láttam. Ne kavard meg ezzel a zöldséggel a kérdezőt.

2022. máj. 28. 15:22
Hasznos számodra ez a válasz?
 15/34 anonim ***** válasza:
63%
11. Válaszban hogy jött az első sorba a MOV AX,4 ez a 4 miből ered? Miért pont 4?
2022. máj. 28. 15:56
Hasznos számodra ez a válasz?
 16/34 A kérdező kommentje:

Akkor az Assembly programban csak egy regiszterben lehet érték, a többi regiszterben ilyenkor nincs? Változóknál ugye nem így van?

Mert így olyan, mintha minden egyes új érték hozzáadásánál, újból át kéne pakolni egyenként végig az értéket.

2022. máj. 28. 16:15
 17/34 A kérdező kommentje:
Pl. x = y + a + v + f esetén elég hosszú kód lesz.
2022. máj. 28. 16:17
 18/34 anonim ***** válasza:
72%

"Akkor az Assembly programban csak egy regiszterben lehet érték, a többi regiszterben ilyenkor nincs?"

Ezt miből sikerült leszűrni?!?

Te magad cáfoltad ezt a kérdésesben.


"Pl. x = y + a + v + f esetén elég hosszú kód lesz"

Az összeadás asszociatív.

2022. máj. 28. 16:40
Hasznos számodra ez a válasz?
 19/34 anonim ***** válasza:
63%

Kérdező 16/18 2022.05.28. 16:15


"Akkor az Assembly programban csak egy regiszterben lehet érték" Igen is meg nem is. Ez nagyon processzor függő. Ezért tartom veszélyesnek 5. (2022.05.27. 22:11) a 8. (2022.05.27. 23:22) a 10. (2022.05.28. 01:02), a 11. (2022.05.28. 01:13) válaszokat. Mert amit írt a válaszadó egy teljesen "hipotetikus" (azaz nem létező) soha, senki által nem használt, hibás felépítésű processzor típusra vonatkozik. A felsorolt válaszok teljesen értelmetlenek, értelmezhetetlenek, minden szakmaiságot nélkülöznek. Teljesen figyelmen kívül kell hagyni mert azokból egy szó sem igaz amit ott leírt.


Alapvetően amit felvetettél a 17. kérdésedben, egy nagyon fontos kérdés, és ez nagyon erősen processzor típus függő is. Talán ez az egyik legszembetűnőbb különbség a különböző procik között. Ezért van annyi assembly ahány processzor. Most a "történelmet" hagyjuk (pl. a két és három címes processzorok/gépeket az 1950-es 1960-as évekből) ott vannak izgalmas megoldások.

A mai processzorok több regiszterrel rendelkeznek. Ezek között lehet műveletet végezni. Jelölhetjük (hogy általánosabb legyen a példa) R1, R2, R3, R4... Rx-el a belső regisztereit a procinak (pl. x86-nál EAX, EBX stb. nevekkel; de általánosabban legyen az R1, R2, R3..).

A legtöbb processzorban nincs lényegi különbség az R1, R2, R3... stb. regiszter használhatóságában (hogy hány darab van proci függő van amiben pl. csak 4-5 db. van amibel akár 10 db. is lehet). Néhány (főleg régebbi proci esetén) ezen kívül volt egy kitüntett regiszter az Akkumulátor (általában ez volt az A regiszter, vagy a PIC családnál a W /Working/ regiszter). Ilyenkor legyen A, R1, R2, R3 ... Rx a regiszterek neve.

Az nagyon processzor függő, hogy a memória->regiszter vagy a regiszter->memória műveleteket melyik regiszterekkel lehet elvégezni. Illetve milyen címzési módokkal. Pl. a már említett Z80 esetén direkt címzéssel (azaz az utasítás tartalmazza a memórai címet ahol van az adat) csak az A regiszterrel lehet végezni. De ha ún. indirekt címzést használsz, és egy kitüntetett regiszterbe teszed a memória címet (jelesül a Z80-nál ez a HL volt) akkor bármelyik regiszter<->memória mozgatás használható volt. Ez már proci függő.


Az, hogy a matematikai műveleteket hogyan végzi az ember a regiszterek között megint változó. Vannak procik amik (un. akkumulátor procik) ahol az egyik operandus kötelezően az akkumulátor és az eredmény ide kerül. Ezeknél közvetlenül csk az az A:=A+Rx művelet végezhető el. Vannak amelyeknél tetszőleges két regiszter összeadható ilynekor az eredmény az első regiszterbe kerül pl. Rx:=Rx+Ry


Nagy különbség egyébként egy összeadás sorozatnál nem lesz, de más műveleti sornál már lehet értelme a regisztereket "értelmesne" használni.


Pl.:


Feladat: j:=x+y+z


R1:=memória cím X változó

R2:=memória cím Y változó

R1:=R1+R2

R2:=memória cím Z változó

R1:=R1+R2

memória cím J változó := R1


ugyannyi művelet mintha így írnám:


R1:=memória cím X változó

R2:=memória cím Y változó

R3:=memória cím Z változó

R1:=R1+R2

R1:=R1+R3

memória cím J változó := R1


Néhány esetben "kötött" lehet, hogy melyik regiszter mire illik használni de vannak totál általános esetek is.


Ha memória<->regiszter mávelet csak az A-val lehetséges, és csak ezzel tud sázmolni akkor kell pakolgatni.


A:=memória cím X változó

R1:=A (itt az R1-ben az X értéke lesz)

A:=memória cím Y változó

A:=A+R1 (itt az A-ban X+Y lesz)

R1:=A (itt az R1-ben X+Y lesz)

A:=memória cím Z változó

A:=A+R1 (itt az A-ban X+Y+Z lesz)

memória cím J változó:=A


Dehogy melyiket tudod használni az már proci függő. És ezt még lehet "csűrni csavarni". De nem úgy ahogy a hivatkozott válaszokban szereplő zöldségek írják.

2022. máj. 28. 21:26
Hasznos számodra ez a válasz?
 20/34 A kérdező kommentje:

Sima összeadás is nagyon nehéz, inkább másik programnyelvet választok.


Azért köszi.

2022. máj. 29. 00:39
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!