Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 65292
Создание отчето... 61750
Модуль Forms 61632
ТЕХНОЛОГИИ ДОСТ... 58198
Пример работы с... 55823
Имитационное мо... 53568
Реклама
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

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

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Что 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 14:59:17 · 0 Комментариев · 5797 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
MPTools
3D Октаэдр
IIIDTrans
CoolControls v3.0...
Архив программ
Averaging [Исходн...
Песочные часы
SendSMS для PHP-F...
Ics
Delphi 6/7 базы д...
Animation (Пример...
EditNew
PrevInst
FileFind
DelphiXIsoDemo1
PCXReader. Програ...
Rotolabel
THttpScan v4.1
DelphiX
Scrrlcaptoin

Топ загрузок
Приложение Клие... 100399
Delphi 7 Enterp... 84044
Converter AMR<-... 20052
GPSS World Stud... 11501
Borland C++Buil... 11300
Borland Delphi ... 8251
Turbo Pascal fo... 6994
Visual Studio 2... 4975
Калькулятор [Ис... 4499
FreeSMS v1.3.1 3517
Случайные статьи
Настройка параметр...
Этот аутентификато...
Разработать прикл...
Порядок теорем
ЭЛЕМЕНТЫ ПРОЦЕДУРЫ...
Проверьте режим пе...
Разработать програ...
Unexpected end of ...
1.1. Разработка пр...
Что документировать
Соединения должны ...
В обоих требуется ...
Установка MPlayer ...
Численные алгоритмы
Настенные часы
Объединение элемен...
Главное меню
Процедура SetAllPa...
Возникновение "што...
Функция InstallUse...
Содержание
Настройка плагина ...
таблицы Authors
Идеалы программиро...
Размеры классов с ...
Статистика



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


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