Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Турбо Ассеблер и Паскаль. ООП. Турбо Ассеблер и Паскаль. ООП. 
:(
    Опции темы
pmy
Дата 12.10.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.10.2006

Репутация: нет
Всего: нет



У меня вопросец. 
Есть ООП программа на Паскале. Есть объект,  имеющий внешний метод. Этот метод написан на Ассемблере. Помогите разобраться, что делает эта прога.

Вот текст программы на Паскале:

program lab1;
type myObject=object
     Age: word;
     constructor Init;
     function GetAge:word;
     end;

{$L d:\metod.obj}


constructor myObject.Init;
begin
 Age:=25;
end;

function myObject.GetAge:word;external;

var Object1: myObject;
    w:word;
begin
  Object1.Init;
  w:=Object1.GetAge;
  WriteLn(w);
  readln;
  end.





Вот метод, написанный на ассемблере:

.model TPASCAL
 
public myObject@GetAge

.code
myObject@GetAge proc
arg self:dword
push ds
les di,self
mov ax,word ptr es:[di]
pop ds
ret
myObject@GetAge endp

END


Объясните пожалуйста код, написанный на ассемблере.
PM MAIL   Вверх
Sartorius
Дата 12.10.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: нет
Всего: 37



Выводит Age

GetAge - возвращает Age

Код


mov ax,word ptr es:[di]

 :
PM MAIL ICQ   Вверх
dumb
Дата 12.10.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 7
Всего: 158



при вызове метода первым параметром на стек кладется указатель на объект(self).
т.е. вызов
Код

  w:=Object1.GetAge;

в дизассемблере будет выглядеть примерно так:
Код

 push ds
 push offset Object1
 call myObject.GetAge
 mov [w],ax


в функции myObject.GetAge в пару es:di загружается указатель на Object1. и затем, закладываясь на компилятор и хранение объектов в памяти(Age в объекте объявлен первым и в памяти будет храниться в первом слове данных, отведенных под хранение Object1), происходит вычитывание Age в ax.

ps. push ds, pop ds в данном случае лишние.
PM MAIL   Вверх
pmy
Дата 12.10.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.10.2006

Репутация: нет
Всего: нет



Спасибо! Но если не сложно, можно построчно объяснить ассемблеровскую прогу? smile 
PM MAIL   Вверх
Sartorius
Дата 12.10.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: нет
Всего: 37



Код

myObject@GetAge proc ; cобсно название метода (на паскале давно не писал - очевидно он допосняет имя метода через собаку именем класса)
arg self:dword;  аргументы (указатель на экзэмпляр класса передается неявно)
push ds ; ну это лишнее - вроде же ds нигде не меняют
les di,self; загрузим self  в регистровую пару es:di
mov ax,word ptr es:[di] ; прочитаем значение по этому адресу - первое и единственное поле Age
pop ds
ret; выходим , а в ах - возвращаем age
myObject@GetAge endp

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.