На этом шаге мы рассмотрим функции-члены класса.
Объекты классов и их функции-члены усложняют ассемблерный текст. Взгляните на пример программы с простым классом (листинг 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.