Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: CL | DM;

Вниз

Обращение к 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
1-63078
Dublicator
2004-01-07 12:36
2004.01.20
Скрытие приложения


1-63088
IGORZ
2004-01-08 13:34
2004.01.20
avi файл из resource


14-63340
N169
2003-12-30 11:26
2004.01.20
Японский день (LOL)


3-63026
BlackTiger
2003-12-21 22:38
2004.01.20
Глюки грида DeveloperExpress4? Или как?


7-63410
ФЫ
2003-10-23 22:52
2004.01.20
дисковод