Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-63151
jiurajhgjhgty
2004-01-06 22:30
2004.01.20
Хочу в Excel кое-что из delphi удалить.Не знаю как


1-63065
афвуд
2004-01-08 18:57
2004.01.20
Размеры окна в нормальном состоянии


3-62968
Olivka
2003-12-24 12:49
2004.01.20
Работа с ХП, возвращающими данные через FIBdataset


1-63228
Sergious
2004-01-09 15:39
2004.01.20
А в Delphi 7 есть закладка FastNet?


7-63430
--olg-
2003-11-06 11:15
2004.01.20
WinSpool.OpenPrinter





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский