Страница 1 из 1

assembler in class

СообщениеДобавлено: 20.02.2011 21:11:59
Maxizar
Начал по немного изучать 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 записали мусор, Почему? Ассемблер в методах класса работает по другому? Если да, то в чем отличие..

Re: assembler in class

СообщениеДобавлено: 20.02.2011 21:24:56
Иван Шихалев
Первый параметр метода — неявный self.

Re: assembler in class

СообщениеДобавлено: 20.02.2011 21:33:05
Maxizar
Спасибо, буду знать... Наверное это написано в более толстых книгах по асму :)
PS. Переписал процедуру, теперь все работает. Еще раз Спасибо... :wink:

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

СообщениеДобавлено: 20.02.2011 21:41:11
Иван Шихалев
Это написано в «Руководстве программиста» в документации FPC.

Re: assembler in class

СообщениеДобавлено: 24.02.2011 13:45:41
Maxizar
Иван Шихалев - Спасибо.
Не стал открывать, новую тему, вопрос из той же оперы, а именно:
Есть определенный класс 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 положить значение какого нибудь поля класса?

Re: assembler in class

СообщениеДобавлено: 24.02.2011 18:55:00
Иван Шихалев
Без использования EAX, думаю, нельзя. Собственно, откуда-то должен браться self. Правда, можно задать методу тип вызова, например, stdcall и брать self из стека. Но стоит ли овчинка выделки?

Re: assembler in class

СообщениеДобавлено: 24.02.2011 20:43:49
Maxizar
Хорошо, пока буду делать, так, просто я думал компилятор сам расчитает, относительно self, смещение поля FCountFFTPoint.