assembler in class

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

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

Ответить
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

assembler in class

Сообщение 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 записали мусор, Почему? Ассемблер в методах класса работает по другому? Если да, то в чем отличие..
Последний раз редактировалось Maxizar 24.02.2011 12:38:18, всего редактировалось 2 раза.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Первый параметр метода — неявный self.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Спасибо, буду знать... Наверное это написано в более толстых книгах по асму :)
PS. Переписал процедуру, теперь все работает. Еще раз Спасибо... :wink:
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Это написано в «Руководстве программиста» в документации FPC.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение 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 положить значение какого нибудь поля класса?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Без использования EAX, думаю, нельзя. Собственно, откуда-то должен браться self. Правда, можно задать методу тип вызова, например, stdcall и брать self из стека. Но стоит ли овчинка выделки?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

Хорошо, пока буду делать, так, просто я думал компилятор сам расчитает, относительно self, смещение поля FCountFFTPoint.
Ответить