Wszystko tak samo, tylko się bardziej zagnieżdża. Ot, taki przykład:
type TTablica = record
a:array of array of byte;
b:array of byte;
c:word;
end;
var t:array of TTablica;
a, b, c, d:cardinal;
begin
//zapisujemy t[a].a[b, c] do t[a].b[d]
asm
mov esi, t //esi = @t[0]
mov eax, a
mov edx, 10 //SizeOf(TTablica)
mul edx //eax = a*SizeOf(TTablica)
{
jesli znamy rozmiar TTablica i jest on = 2, 4, 8, to mozna prosciej:
mov eax, a
lea esi, [esi+eax*8]
}
add esi, eax //esi = @t[a]
mov edi, TTablica([esi]).b //edi = @t[a].b[0]
mov esi, TTablica([esi]).a //esi = @t[a].a[0]
mov eax, b
mov esi, [esi+4*eax] //esi = @t[a].a[b][0]
add esi, c //esi = @t[a].a[b][c]
mov dl, [esi] //dl = t[a].a[b][c]
add edi, d
mov [edi], dl
end;
PS: akurat Delphi ma wyjątkowo dobrą optymalizacje. Polecam ustawić breakpointa w interesującym ciebie miejscu i potem, przy zatrzymanym programie, z menu: View->Debug Windows->CPU