2011-06-20 21 views
5

アセンブリ(delphi)内の配列の要素にアクセスする際に問題があります。Delphi +アセンブリ配列へのアクセス

コードは次のとおりです。

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

動的配列はポインタであるので、あなたはleaの代わりにmovを使用する必要があります。

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

ありがとうございました!できます... –

関連する問題