2011-06-20 23 views
5

Derlemede (delphi) bir dizinin bir öğesine erişmek için bir sorun yaşıyorum.Delphi + Derleme dizisine erişim

kodudur:

procedure TMaskBit.AllocBuffer; 
begin 
    SetLength(DataIn, 6); //array of integer 
    DataIn[0] := 1 ; 
    DataIn[1] := 2 ; 
    DataIn[2] := 3 ; 
    DataIn[3] := 4 ; 
    DataIn[4] :=5 ; 
    DataIn[5] := 6 ; 
end; 

procedure TMaskBit.SetValue(); 
asm 
    lea edx, [eax].TMaskBit.DataIn  //indice 
    mov ecx, [edx+8]     //second ement 
    mov [EAX].TMaskBit.Z, ecx 
end; 

ne yanlış olabilir?

Teşekkürler!

+2

Nasıl bazı belirtiler anlatırsın? –

+0

Z değişkeninde çöp görüyorum. Sayı 2'yi görmeyi bekledim (DataIn [1]). –

+0

Bunu assembler'da yazmanın iyi bir fikir olduğuna emin misin? –

cevap

12

Dinamik Dizi bir işaretçi, yani lea yerine mov kullanmalıdır:

type 
    TIntArray = array of Integer; 

    TMaskBit = class 
    Z: Integer; 
    DataIn: TIntArray; 
    procedure AllocBuffer; 
    procedure SetValue(); 
    end; 

procedure TMaskBit.AllocBuffer; 
begin 
    SetLength(DataIn, 6); //array of integer 
    DataIn[0] := 1 ; 
    DataIn[1] := 2 ; 
    DataIn[2] := 3 ; 
    DataIn[3] := 4 ; 
    DataIn[4] :=5 ; 
    DataIn[5] := 6 ; 
end; 

procedure TMaskBit.SetValue(); 
asm 
    mov edx, [eax].TMaskBit.DataIn  // edx references DataIn[0] !!! 
    mov ecx, [edx+8]     // DataIn[2] 
    mov [EAX].TMaskBit.Z, ecx 
end; 

procedure TForm7.Button3Click(Sender: TObject); 
var 
    MB: TMaskBit; 

begin 
    MB:= TMaskBit.Create; 
    MB.AllocBuffer; 
    MB.SetValue; 
    ShowMessage(IntToStr(MB.Z)); 
end; 
+0

TEŞEKKÜRLER! İşe yarıyor... –