Írtam papíron egy egyszerű c programot amely egy két dimenziós tömböt manipulál:
Ansi C kód 4x4-es tömb, minden második sorát inicializáljuk 255-tel.
{
char x=4; // ezek csak a tömb mérete miatt vannak deklarálva
char y=4; // ezek csak a tömb mérete miatt vannak deklarálva
char tomb[4][4]; // nem inicializált
char i;
char j:
for (i=0;i<x;i=i+2)
{
for (j=0;j<y;j++)
{ tomb[i][j]=255;}
}
}
Memóriaszervezés:
IndexRegiszter kezdőcím +
0. char x
1. char y
2. base address LOBYTE : char TOMB[i][j] - vegyük úgy, hogy a végrehajtáskor már valahova mutat
3. base address HIBYTE : char TOMB[i][j]
4. char i
5. char j
Assembly code (kézzel írtam index regiszter használatával)
INIC_FOR_i:
LD(IX+4),0 ; for(i=0;.....)
FOR_i:
LD A,(IX+4) ;A <- char i
LD L,(IX+0) ;L <- char x
CMP L ;for(...;i<x;...)
JR C, END_FOR_i ; elöl tesztelt for_i addig hajtjuk végre a ciklust amíg igaz: i<x
INIC_FOR_j:
LD (IX+5),0 ;for(j=0;.....)
FOR_j:
LD a,(IX+5) ;A <- char j
LD L,(IX+0) ;L <- char y
CMP L ;for(...;j<y;...)
JR C, END_FOR_j ; elöl tesztelt for_j addig hajtjuk végre a ciklust amíg igaz: j<y
LD L,(IX+2)
LD H,(IX+3) ; HL <- base address of char tomb[][]
LD BC,HL ; BC <- base address of char tomb[][]
; most jön a tömb indexelt címének meghatározása: BASE_ADDR + 4*i + j
; elöször 4*i kiszámolása
LD A,(IX+4) ; A <- char i
SLA A
SLA A ; 2x szorzás 2-vel a tömb 2. dimenziója miatt, itt kicsit megdöbbentem, hogy a Z80 nem kérdi, hányszor akarok léptetni
LD DE,0
LD E,A ; DE <- 4*i
LD HL,0
LD L,(IX+5) ; HL <- char j
ADD HL,DE ; 4*i + j
ADD HL,BC ; BASE_ADDR + (4*i+j)
LD (HL),255 ; tomb[i][j]=255;
LD A,(IX+5) ; A <- char j
INC A ; A++
LD (IX+5),A ; for(........;j++)
JR FOR_j ; for(j... a növelés után visszaugrik elöltesztelésre
END_FOR_j: ; ciklus vége
LD A,(IX+4) ; A <- char i
ADD A,2 ; A=A+2
LD (IX+5),A ; for(........;i=i+2)
JR FOR_i ; for(i... a növelés után visszaugrik elöltesztelésre
END_FOR_i: ; ciklus vége
RET