Mért így van Assembly-ben?
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.
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.
"Ez a kód működni fog."
Az enyém is, effelől nyugodt lehetsz.
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.
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.
"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.
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.
Sima összeadás is nagyon nehéz, inkább másik programnyelvet választok.
Azért köszi.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!