2011-06-20 5 views
5

У меня возникла проблема с доступом к элементу массива в сборке (delphi).Доступ к массиву Delphi + Assembly

Код:

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; 

Что может быть не так?

Спасибо!

+2

Как рассказывать некоторые симптомы? –

+0

Я вижу мусор на переменной Z. Я ожидал увидеть номер 2 (DataIn [1]). –

+0

Вы уверены, что написать это на ассемблере - это хорошая идея? –

ответ

12

динамического массива является указателем, поэтому вы должны использовать mov вместо lea:

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

СПАСИБО МНОГО! Оно работает... –