assembler in class

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

assembler in class

Сообщение Maxizar » 20.02.2011 21:11:59

Начал по немного изучать Assembler в FPC, пример кода процедуры на асме:
Код: Выделить всё
function Test2(Value:ShortInt):Integer; register;
begin
{$ASMMODE intel}
   asm
    cbw  //переводим al в ax
    cwde //переводим ax в eax
   end;
end;


код тестирования :
Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
VAR I:shortInt;
begin
   I:=-10;
   Caption:=IntToStr(Test2(I));
end;


видим что все ок
Теперь пишем процедуру как метод класса, в данном случае метод формы:
Код: Выделить всё
TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { private declarations }
  public
   function Test1(Value:ShortInt):Integer; register;
    { public declarations }
  end; 


Реализация:
Код: Выделить всё
function TForm1.Test1(Value: ShortInt): Integer; register;
begin
{$ASMMODE intel}
   asm
    cbw
    cwde
   end;
end;


Тест:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
VAR I:shortInt;
begin
   I:=-10;
   Caption:=IntToStr(Test1(I));
end;


Видим, что в Caption записали мусор, Почему? Ассемблер в методах класса работает по другому? Если да, то в чем отличие..
Последний раз редактировалось Maxizar 24.02.2011 13:38:18, всего редактировалось 2 раз(а).
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: assembler in class

Сообщение Иван Шихалев » 20.02.2011 21:24:56

Первый параметр метода — неявный self.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: assembler in class

Сообщение Maxizar » 20.02.2011 21:33:05

Спасибо, буду знать... Наверное это написано в более толстых книгах по асму :)
PS. Переписал процедуру, теперь все работает. Еще раз Спасибо... :wink:
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: assembler in class[Решено]

Сообщение Иван Шихалев » 20.02.2011 21:41:11

Это написано в «Руководстве программиста» в документации FPC.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: assembler in class

Сообщение Maxizar » 24.02.2011 13:45:41

Иван Шихалев - Спасибо.
Не стал открывать, новую тему, вопрос из той же оперы, а именно:
Есть определенный класс TSpectr, в нем есть поле: FCountFFTPoint.
Пишу процедуру(метода класса) на асме, согласно тому что в EAX передали Self...
Код: Выделить всё
function TSpectr.GetFirstIndex1(Len: integer):integer;
begin
{$ASMMODE intel}
asm
  mov ecx, FCountFFTPoint
  jnz @@loop

@@loop:
тру ля ля
end;
end;

В ЕСХ записали чушь... если же сделать так:
Код: Выделить всё
mov ecx, TSpectr[eax].FCountFFTPoint

то в ECX записали то что нужно.
Теперь ни сколько вопрос, сколько уточнение, 1 вариант не работает (это так и должно быть) или я просто что то не так делаю. Просто иногда нужен лишний регистр, и каждый раз обращение вида TSpectr[eax].FCountFFTPoint , картину всю портит. Тобишь нельзя так сразу в регист командой mov положить значение какого нибудь поля класса?
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: assembler in class

Сообщение Иван Шихалев » 24.02.2011 18:55:00

Без использования EAX, думаю, нельзя. Собственно, откуда-то должен браться self. Правда, можно задать методу тип вызова, например, stdcall и брать self из стека. Но стоит ли овчинка выделки?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: assembler in class

Сообщение Maxizar » 24.02.2011 20:43:49

Хорошо, пока буду делать, так, просто я думал компилятор сам расчитает, относительно self, смещение поля FCountFFTPoint.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru