Шаг 5.
Оптимизация с помощью ассемблера.
Анатомия функций языка C. Функции - члены класса

    На этом шаге мы рассмотрим функции-члены класса.

    Объекты классов и их функции-члены усложняют ассемблерный текст. Взгляните на пример программы с простым классом (листинг 1). Скомпилируйте его с помощью команды bcc -S classf и исследуйте результирующий ассемблерный код в файле CLASSF.ASM.

    Листинг 1. CLASSF.CPP (Скомпилируйте с опцией -S)

#include <iostream.h>
class TClass
{
  public:
      int x;
      void SetX(int n);
      int GetX();  
};
main()
{
  TClass q;
  q.SetX(123);
  cout<<"q.GetX()=="<<q.GetX();
  return 0;
}
void TClass :: SetX(int n)
{
  x=n;
}
int TClass :: GetX()
{
  return x;
}
Текст этого приложения можно взять здесь.

    В классе TClass объявляется один глобальный член (int x) и две функции-члена для чтения и записи значения х. В ассемблерном коде функция-член SetX() после компиляции в версии 3.1 выглядит следующим образом:

 push bp                  ;Сохранить bp
 mov  bp,sp               ;Адресовать стек указателем bp
 push si                  ;Сохранить si, используемый далее
 mov si, word ptr [bp+4]  ;Адресаватьобъект через 'this' с помощью si
 mov ax, word ptr [bp+6]  ;Присвоить параметр функции регистру ax
 mov word ptr [si], ax    ;Присвоить ax члену объекта х
 pop si                   ;Восстановить si
 pop bp                   ; Восстановить bp
 ret                      ;Вернуться в место вызова 

    Использование версии 4.5 даст аналогичные результаты. Как обычно в инструкциях, регистр bp запоминается в стеке, после чего он устанавливается равным стековому указателю sp для адресации значений в стеке, в данном случае параметра int n в функции SetX(int n). После сохранения регистра si в программе с помощью bp регистр si устанавливается равным указателю this, передаваемому всем нестатическим функциям-членам класса. Указатель this ссылается на объект, для которого в операторе вызывалась нестатическая функция-член, в данном случае на объект q, объявленный в функции main(). После инициализации регистра si значением this в программе регистру ax присваивается значение [bp+6], которое ссылается на параметр n. Затем в программе это значение присваивается по адресу word ptr [si], ссылающемуся на первое слово объекта q. Наконец, в программе перед возвратом из функции восстанавливаются регистры si и bp.

    Нелишним будет напомнить о том, что нестатические функции-члены класса получают указатель this на объект, для которого в операторе вызывались эти функции. В программах на ассемблере вы можете воспользоваться указателем this для определения местоположения объекта в памяти.

    На следующем шаге мы рассмотрим написание встраиваемого кода BASM.




Предыдущий шаг Содержание Следующий шаг