Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизОбращение к private переменным класса из ассемблерной вставки Найти похожие ветки
← →
Sirakuz (2004-01-07 02:28) [0]Есть класс TMyClass. В нём В секции private объявлена переменная FItems:TItems; TItems - динамический массив. Есть также public процедура. В этой процедуре я пишу:
asm
lea ebx, [FItems]
.......
Но в дельфийском отладчике это компилируется как lea ebx, [$00000004].
Как же тогда обращаться через ассемблерные вставки к таким переменным?
← →
Andy BitOff (2004-01-07 02:34) [1]Приведи кусок кода с объявлениями
← →
default (2004-01-07 02:39) [2]зачем такие страсти?
← →
Andy BitOff (2004-01-07 02:43) [3]default © (07.01.04 02:39) [2]
зачем такие страсти?
Ну хочет человек, пучкай париться, да и мозги разомну, а то с дельфями совсем асм забросил.
← →
Sirakuz (2004-01-07 02:44) [4]interface
type
TMyString=String[5];
TItems=Array of TMyString;
TShortStringList=class
private
FItems:TItems;
public
constructor create(initSize:Integer = 20);
destructor free;
Procedure Delete(i:Integer);
end;
implementation
Procedure TShortStringList.Delete(i:Integer);
Begin
asm
lea ebx, [FItems]
end;
End
Примерно такой код.
← →
default (2004-01-07 02:45) [5]и чего?где хоть mov-ы какие-нить или ещё чего?
← →
Sirakuz (2004-01-07 02:48) [6]Зачем mov-ы когда в ebx уже чушь лежит.
← →
raidan (2004-01-07 02:48) [7]
> и чего?где хоть mov-ы какие-нить или ещё чего?
Гыыыы :)))
← →
Andy BitOff (2004-01-07 02:52) [8]Ша аше посмотрю, но на первый взляд;
ebx надо сохранять!!!!!(если используешь обычную процедуру.
И, скорее всего, здесь без lea обойтись проще.
А вообще ща посмотрим.
← →
default (2004-01-07 02:52) [9]raidan © (07.01.04 02:48) [7]
не прикольно над одной командой голову ломать...
← →
Andy BitOff (2004-01-07 02:56) [10]дык он же не говорит ничего.
но вроде понятно, что хочет удалить некий итем. Так? Sirakuz!
← →
Sirakuz (2004-01-07 03:02) [11]>Andy BitOff
>но вроде понятно, что хочет удалить некий итем. Так? Sirakuz!
Ну не совсем чтобы удалить. Процедуру я обозвал просто так. На самом деле мне очень хочеться загрузить в регистр начало массива.
← →
default (2004-01-07 03:08) [12]
var
Mas: TItems;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetLength(Mas, 2);
Mas[0] := "123";
Mas[1] := "457";
asm
MOV ECX, Mas
MOV BYTE PTR [ECX + 9], "6"
end;
Caption := Mas[0] + Mas[1]
end;
типа этого...
← →
Sirakuz (2004-01-07 03:23) [13]default,
Ну это то понятно, тут никаких вопросов. Но меня интересует именно обращение к private переменной класса.
Пробовал писать так:
MOV ECX, Mas
Но отладчик всё равно у меня показывает, что это дело откомпилировалось в: mov ebx, $00000004
Это скорее всего связано из-за того, что у меня класс, а у тебя глобальная переменная
← →
Andy BitOff (2004-01-07 03:28) [14]Приведи мне весь код юнита (если он конечно не очень огромный)
← →
default (2004-01-07 03:30) [15]нафига скажи всё это
← →
default (2004-01-07 03:48) [16]сделай типа FItems[0] := "dfdff" и открывай окно CPU там всё есть
← →
Sirakuz (2004-01-07 03:58) [17]unit Unit2;
interface
type
TMyString=String[8];
TItems=Array of TMyString;
TShortStringList=class
private
FItems:TItems;
FCount:Integer;
FArrLen:Integer;
public
constructor create(initSize:Integer = 20);
destructor free;
Procedure Clear;
Procedure Add(s:TMyString);
Property Count:Integer read FCount;
property Items:TItems read FItems write FItems;
end;
implementation
Constructor TShortStringList.create;
Begin
Setlength(FItems, initSize);
FArrLen:=initSize;
FCount:=0;
End;
Destructor TShortStringList.Free;
Begin
FArrLen:=0;
FCount:=0;
Setlength(FItems, 0);
End;
Procedure TShortStringList.Clear;
Begin
FCount:=0;
End;
Procedure TShortStringList.Add(s:TMyString);
Begin
if FArrLen<=FCount then
Begin
if FArrLen<>0 then Setlength(Fitems, FArrLen+FArrLen*2) else
Setlength(Fitems, 20);
FArrLen:=Length(FItems);
End;
// Здесь я хочу написать на асме вот такую конструкцию:
// Fitems[FCount]:=s;
// Всё дело в том, что я оптимизирую приложение, и мне не
// нужен стандартный дельфийский _PStrNCpy , так как он
// копирует такие строки по 4 байта (system.move), а я хочу
// сделать копирование строк по 8 байт с помощью mmx: movq.
// Но незадача: никак не получается загрузить в регистр начало
// массива.
asm
lea eax,Fitems[FCount]
// Здесь если посмотреть в отладчике будет lea eax, [$000000C]
// если написать так:lea eax,Fitems[FCount], то в отладчике будет
// lea eax, [$00000004] ....
{...
...
...}
End;
inc(FCount);
End;
end.
---------------------
procedure TForm1.Button1Click(Sender: TObject);
var
Sl:TShortStringList;
begin
sl:=TShortStringList.create;
sl.Add("1234");
sl.free;
end;
← →
Andy BitOff (2004-01-07 04:06) [18]Ну я вообщем не дождался твоего кода, поэтому рещение по данным известным на тот момент.
default оказался прав!!! Проще было посмотреть (я как всегда торможу). Вот что у меня получилось;
var
Inn:TShortStringList;
procedure TForm1.FormCreate(Sender: TObject);
begin
Inn:=TShortStringList.Create;
SetLength(Inn.FItems,10);
try
inn.FItems[0]:="aaaa0";
inn.FItems[1]:="aaaa1";
inn.FItems[2]:="aaaa2";
inn.FItems[3]:="aaaa3";
inn.Delete(2);
finally
Inn.Free;
end;
end;
Procedure TShortStringList.Delete(i:Integer);
Begin
asm
mov edx,[Inn]
mov edx,[edx+4]
mov ecx,i
xor eax,eax
@aa1:
mov al,byte ptr [edx]
inc eax
add edx,eax
loopne @aa1
// в этот момент EDX указывает на адрес элемента переданого
// через Delete
end;
End;
← →
default (2004-01-07 04:08) [19]говорю посмотри в CPU...
← →
Sirakuz (2004-01-07 11:40) [20]>Andy BitOff
> var
> Inn:TShortStringList;
.....
> Procedure TShortStringList.Delete(i:Integer);
> Begin
> asm
> mov edx,[Inn]
Чё то странно как-то. Ты я так понимаю обращаещься из класса к конкретному экземпляру. Ну а если у меня таких 100?
Вобщем я тут сам уже понял как это надо делать(получить в регистр начало массива):
mov eax, self
mov eax, [eax+Fitems]
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c