Навигация
Главная
Поиск
Форум
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
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
ТЕХНОЛОГИИ ДОСТ... 64160
Имитационное мо... 58787
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

Принадлежит ли точка пересечению двух окружностей на Turbo Pascal + Отче...
Моделирование станции технического обслуживания на GPSS + Отчет
Обратное размещение элементов ЭВС на 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 Комментариев · 6110 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
AJAX и PHP. разра...
Tetris 2002
Delphi. Готовые а...
Краснов М. - Open...
Паскаль и Дельфи....
Delphi и технолог...
HTMLredaktor
Обучение Borland ...
DragMe [Исходник ...
TmxOutlookBarPro
EMS QuickExport S...
Архив значков
Delphi. Учимся на...
PHP 5. Практика с...
3D Тетрис [Исходн...
Измерение тактово...
База игр
Delphi 2006 - Спр...
Atb
Форма в форме

Топ загрузок
Приложение Клие... 100498
Delphi 7 Enterp... 88633
Converter AMR<-... 20084
GPSS World Stud... 13996
Borland C++Buil... 12267
Borland Delphi ... 8763
Turbo Pascal fo... 7062
Visual Studio 2... 5007
Калькулятор [Ис... 4986
FreeSMS v1.3.1 3547
Случайные статьи
Исключения в списк...
MediaDesc
Регулярные выражения
Моделирование библ...
Компиляция проекта...
Основные комбинаторы
Комбинирование соб...
MailBomber НА Delp...
Пример: простой те...
Политика отключения
Зашли в тупик?
5.5. РЕШЕНИЕ: ОБЪЯ...
Распределенные фай...
Синхронизация буфе...
Установка адаптера...
Можно ли использов...
ОБРАЗОВАНИЕ ПЛОТНО...
Использование сред...
RTTI
и ключа шифрования...
Объект DataView, с...
7.1. Словарь в в...
ПРИНАДЛЕЖНОСТЬ ЭЛЕ...
Works
Пример создания та...
Статистика



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


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