31
Assembly / Re: Assembly programozás
« Last post by Tuby128 on 2023.December.06. 21:25:30 »Valaki meg tudná nekem mondani, hogy az Indexregiszteres címzés az összeadással mire jó?
PL: LD A, (IX+d)
Nekem az jutott először eszembe, hogy egy dimenziós char (8 bites) tömb elérésére lehet alkalmas. 16 bitesre már nem jó, mert nincs benne szorzás. (habár a 2-vel és 4-gyel való szorzás bit-shift-tel könnyen megoldható lenne)
Viszont aztán rájöttem, hogy a +d egy konstans amit a OP-kód után adunk meg, emiatt nem is lehet vele dinamikusan tömböt indexelni.
Egyedül azt tudom elképzelni, hogy a memóriába tettünk változókat egy adott címtől kezdve,
pl.
0. cím -> első változó (1 byte-os)
1. cím -> második változó (1 byte-os)
2. cím -> harmadik változó alsó 8 bites értéke (2 byte-os)
3. cím -> harmadik változó felső 8 bites értéke (2 byte-os)
És akkor így is hivatkozik rá:
LD A,0x23
LD (IX+0),A - elsó változóba töltjük 0x23 értéket
LD HL,0xAB12
LD (IX+2),L
LD (IX+3),H - harmadik változóba töltjük a 0xAB12 értéket
Ugye ez a megoldás akkor kell, amikor egy szubrutinban több lokális változónk van, mint amennyi regiszter elérhető (BC,DE,HL,IX,IY)
Hátránya ennek a megoldásnak, hogy az indexregiszteres utasítások op kódjai 1 BYTE-tal hosszabbak mint a "normál" regiszteres utasítások, emiatt lassabb a végrehajtása ha tömegesen fordul elő.
Valahol olvastam, hogy némelyik Z80 C-fordítóval az a baj, hogy túlságosan sokat használja az indexregisztereket, ezzel hosszabb lesz a programkód illetve tovább tart a végrehajtás.
Visszatérve a hozzászólás elejére. Vajon egy és kétdimenziós tömböt hogyan lehet indexelni Assembly kóddal a legjobban?
PL: LD A, (IX+d)
Nekem az jutott először eszembe, hogy egy dimenziós char (8 bites) tömb elérésére lehet alkalmas. 16 bitesre már nem jó, mert nincs benne szorzás. (habár a 2-vel és 4-gyel való szorzás bit-shift-tel könnyen megoldható lenne)
Viszont aztán rájöttem, hogy a +d egy konstans amit a OP-kód után adunk meg, emiatt nem is lehet vele dinamikusan tömböt indexelni.
Egyedül azt tudom elképzelni, hogy a memóriába tettünk változókat egy adott címtől kezdve,
pl.
0. cím -> első változó (1 byte-os)
1. cím -> második változó (1 byte-os)
2. cím -> harmadik változó alsó 8 bites értéke (2 byte-os)
3. cím -> harmadik változó felső 8 bites értéke (2 byte-os)
És akkor így is hivatkozik rá:
LD A,0x23
LD (IX+0),A - elsó változóba töltjük 0x23 értéket
LD HL,0xAB12
LD (IX+2),L
LD (IX+3),H - harmadik változóba töltjük a 0xAB12 értéket
Ugye ez a megoldás akkor kell, amikor egy szubrutinban több lokális változónk van, mint amennyi regiszter elérhető (BC,DE,HL,IX,IY)
Hátránya ennek a megoldásnak, hogy az indexregiszteres utasítások op kódjai 1 BYTE-tal hosszabbak mint a "normál" regiszteres utasítások, emiatt lassabb a végrehajtása ha tömegesen fordul elő.
Valahol olvastam, hogy némelyik Z80 C-fordítóval az a baj, hogy túlságosan sokat használja az indexregisztereket, ezzel hosszabb lesz a programkód illetve tovább tart a végrehajtás.
Visszatérve a hozzászólás elejére. Vajon egy és kétdimenziós tömböt hogyan lehet indexelni Assembly kóddal a legjobban?