скалогрыз Спасибо...
- Код: Выделить всё
TIntArray = array [0..4] of integer;
Данный метод не пойдет.. нужно как раз для динамических.. но благодаря фразе:
скалогрыз писал(а):наверное, потому-что массив динамический, который сам по себе указатель на хитрую структуру.
Вы мне открыли глаза... я сам же и забыл что динамический массив это указатель не на первый элемент а именно указатель.. а вот туда куда указывает этот указатель лежит указатель на первый элемент...
... Бывает и такое
Теперь все работает:- Код: Выделить всё
TIntArray1 = array [0..4] of integer;
TIntArray2 = array of integer;
Тест и функции для типа: TIntArray1Асм процедура- Код: Выделить всё
procedure CreateAr1(var D:TIntArray1); register;assembler;
{$ASMMODE intel}
asm
mov dword ptr[EAX],0
mov dword ptr[EAX+4],1
mov dword ptr[EAX+8],2
end;
Тест:- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var D1:TIntArray1;
i:Integer;
begin
CreateAr1(D1);
for i:=0 to High(D1) do
memo1.Lines.Add(IntToStr(D1[I]));
end;
Тест и функции для типа: TIntArray2Асм процедура- Код: Выделить всё
procedure CreateAr2(var D:TIntArray2); register;assembler;
{$ASMMODE intel}
asm
//push EBX
mov ECX,[EAX]
mov dword ptr[ECX],0
mov dword ptr[ECX+4],1
mov dword ptr[ECX+8],2
mov dword ptr[ECX+12],3
end;
Т.е мы сохраняем в ECX значение ячейки памяти на которую указывает (указатель динамического массива)
И тепрь ECX и есть память с которой расположен первый элемент...
Тест:- Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var D1:TIntArray2;
i:Integer;
begin
SetLength(D1,5);
CreateAr2(D1);
for i:=0 to High(D1) do
memo1.Lines.Add(IntToStr(D1[I]));
end;
PS. Всем Спасибо