Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 29
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка
База данных студентов на Turbo Pascal (Списки) + Пояснительная записка

Что Delphi знает об ассемблере
Сегодня мы рассмотрим вопрос применения ассемблера в программах, написанных на Delphi.

Итак, что же Delphi "знает" об ассемблере?

Команды процесора

Ура, начиная с шестой версии, в популярном продукте Borland реализована поддержка всех команд процессора, включая команды расширений MMX, SSE, 3DNow! Теперь нет необходимости вместо простой команды rdtsc писать dw 310Fh .

Доступ к переменным

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

var
i: integer;
begin
i := 0;
asm
mov eax,i
inc eax
mov i,eax
end;
end;





Доступ к параметрам

К переменным, передаваемым процедуре в качастве параметров доступ осуществляется также легко:

procedure SomeProc(i: integer);
begin
asm
mov eax,i
inc eax
mov i,eax
end;
and;





Передача параметров по ссылке

Если параметр процедуры или функции объявляется как var, то вместо значения переменной передается указатель на эту переменную. Поэтому внутри ассемблерного блока этот параметр будет представлять собой 32-разрядный указатель вместо собственно переменной. Поэтому обращаться к параметру, переданному как var надо следующим образом:

procedure SomeProc(var i: integer);
begin
asm
mov eax,i
inc dword ptr [eax]
end;
end;





Регистровое соглашение о вызове

В языке Object Pascal, использующемся в Delphi, по умолчанию действует регистровое соглашение о вызове. Согласно этому соглашению, первые три 32-разрядных параметра передаются в регистры eax,edx и ecx. Следовательно, если функция объявлена следующим образом

function SomeFunc(i1, i2, i3 : integer): integer;





то можно расчитывать, что переменная i1 содержится в регистре eax, i2 - в edx, i3 - в ecx.

Если объявлен некий метод

procedure TSomeObject.SomeProc(i1, i2 : integer);




то i1 передается в edx, i2 - в ecx, а в eax передается неявно заданный параметр Self!

Доступ к полям записи

Обращение к полям записи также достаточно просто:

type
TSomeRec = record
i: integer;
c: char;
end;
procedure SomeProc(var SomeRec: TSomeRec);
begin
asm
mov [eax].TSomeRec.i, 33
mov [eax].TSomeRec.c,'a'
end;
end;





Локальные метки

Хотя использование меток и считается дурным тоном в программировании на языках высокого уровня, в ассеблерных программах без них не обойтись. Внутри блока asm..end можно, без предварительного объявления, использовать метки, начинающиеся с символа '@'.

Сохранение регистров

В ассемблерных процедурах и функциях нужно сохранять регистры EDI, ESI, ESP, EBP, and EBX и свободно оперировать регистрами EAX, ECX, and EDX.

Вызов динамических и виртуальных методов

Существуют две директивы для доступа к динамическим и виртуальным метолам из ассемблерных вставок.

VMTOFFSET - возвращает смещение (в байтах) указателя виртуального метода относительно начала таблицы виртуальных методов (VMT).

DMTINDEX - возвращает индекс динамического метода в таблице динамических методов.

Примеры вызовов виртуального и динамического методов:

procedure CallDynamicMethod(e: TExample);
asm
push esi
mov eax,e
mov esi, DMTINDEX TExample.DynamicMethod
call System.@CallDynaInst
pop esi
end;

procedure CallVirtualMethod(e: TExample);
asm
mov eax, e
mov edx, [eax]
call dword ptr [edx + VMTOFFSET TExample.VirtualMethod]
end;




http://fan-game.ru/
Опубликовал Kest November 13 2008 11:59:17 · 0 Комментариев · 7572 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Delphi Быстрый Ст...
Preview
Алгоритм DES шифр...
Задача о 8ми ладьях
index.php + мод ...
ADVstatusbar
Пример клиента ФТ...
isoCanvas (Редакт...
PCX
Сложный калькулятор
IpEditAdress
Пишем программы и...
Реализация ЭЦП по...
Игра PackMan
Assistant
EMS QuickExport S...
Domen Name IP
Animation Effect ...
около 291 статьи ...
Ehlib

Топ загрузок
Приложение Клие... 100803
Delphi 7 Enterp... 98089
Converter AMR<-... 20309
GPSS World Stud... 17086
Borland C++Buil... 14268
Borland Delphi ... 10395
Turbo Pascal fo... 7400
Калькулятор [Ис... 6097
Visual Studio 2... 5244
Microsoft SQL S... 3678
Случайные статьи
Режим с обострением
• Раскрытие циклов...
Модульные тесты: п...
Архитектура ISDN
Компонент форма
Протоколы сети Инт...
Создание нового пр...
Структура ОП должн...
Премия за завершение
Резюме
Если в приложении ...
Сканирование фотог...
Команда DIV
Применяйте естеств...
Горизонтально напр...
Введение в дисциплину
Вкладка Configure ...
Коллекция объектов...
Игровые автоматы. ...
Оператор выбора case
Однако нужная поло...
OpenGL. СФЕРА И КОНУС
Вычисление суммы ч...
Маршрутизации марш...
Компоненты доступа...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?