Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Сетевой адаптер: осваиваем Интернет" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Все, что вы не знали, но хотели бы узнать о Delphi №14
Выпуск №14 Раздел: Язык Программирования Delphi Подраздел: Этот подраздел может показаться немного скучным, но не все же программированию быть интересным и занимательным? Ассемблер - вещь необходимая, хотя и неприятная для большинства программистов. Этот подраздел разбит на три части, но, по-моему, он того стоит. Уважаемый подписчик, О чем будет следующий раздел - решать вам. Варианты: VCL Системные функции и Winapi Базы данных Работа с файловой системой Репортинг, работа с принтером Работа с сетью, Интернетом, протоколами Работа с графикой, мультимедиа
Ваши предложения высылайте на В этом выпуске: Использование ассемблера в Дельфи
-Примеры ... Начало в предыдущем выпуске. 2.3. Метки
2.4. Определение данных и констант
Примеры
Прямой
доступ к портам в Windows 95 и 98
Подсчет количества установленных бит в integer
Проверка установки отдельного бита (0-31)
Установка отдельного бита (0-31) в единицу
Сброс отдельного бита
Извлечение битовой маски из integer
Модуль CpuInfo unit cpuinfo;
uses Windows, Sysutils; type
var
implementation const
var
{TCPUID} resourcestring
constructor TCPUID.Create; begin
function TCPUID.GetBooleanField(Index: Integer): Boolean; begin
function TCPUID.GetIntegerField(Index: Integer): Integer; begin
function TCPUID.GetVendorID: String; begin
function TCPUID.GetCPUType: TCPUType; begin
function TCPUID.GetCPUFamily: TCPUFamily; begin
function TCPUID.GetFeature(Index: TCPUFeature): Boolean; begin
function TCPUID.GetProcessor: String; begin
function TCPUID.GetLevel2Cache: TCacheSize; var
function GetNibbleGroup(I: Integer): String; var
function TCPUID.GetSerialNumber: String; begin
function TCPUID.GetCPUBrand: TCPUBrandID; var
initialization
Таблица 1: Использование регистров процессора Регистр Код входа Код выхода Можно ли использовать? Нужно ли сохранять EAX Self (1), Первый параметр (2) или не определен (3) Результат функции (4) Да Нет EBX Неизвестно Не используется Да Да ECX Второй параметр (1), третий параметр (2) или не определен (3) Не используется Да Нет EDX Первый параметр (1), второй параметр (2) или не определен (3) Для Int64 старшее двойное слово результата, или не используется Да Нет ESI Не определен Не используется Да Да EDI Не определен Не используется Да Да EBP Указатель фрейма стека Указатель фрейма стека Да Да ESP Указатель стека Указатель стека Да n/a cs Кодовый сегмент (5) Не используется Нет Да ds Сегмент модели памяти (5) Не используется Нет Да es Сегмент модели памяти (5) Не используется Нет Да fs Резервировано для Windows Резервировано для Windows Нет Да gs Резервировано Резервировано Нет Да ss Сегмент стека (5) Не используется Нет Да (1) Для метода, когда используется соглашение Register (2) Для автономных функций и процедур, когда используется соглашение Register (3) Для всех других случаев при всех соглашенияч о вызове (4) Только для результата, который полностью помещается в регистр. См. таблицу для полного обзора как результаты возвращаются из функции. (5) В плоской 32-битной модели памяти все сегментные регистры нормально указывают на один и тот же сегмент памяти. Тем не менее, при анализе поведения Дельфи, оказывается, что регистр cs имеет различное значение. Таблица 2: Передача параметров в функции и процедуры В следующей таблице приведены сведения о передаче параметров по значению (включая, директиву const) в процедуры и функции Дельфи. При передаче по ссылке (директива var), все параметры передаются как 32-битные указатели. Тип Размер Регистр (1) ShortInt 1 байт (2) Да SmallInt 1 слово (2) Да LongInt 1 двойное слово Да Byte 1 байт (2) Да Word 1 слово (2) Да Dword 1 двойное слово Да Int64 8 байт Нет Boolean 1 байт (2) Да ByteBool 1 байт (2) Да WordBool 1 слово (2) Да LongBool 1 двойное слово Да Char 1 байт (2) Да AnsiChar 1 байт (2) Да WideChar 1 слово (2) Да ShortString 32-битный указатель Да AnsiString 32-битный указатель Да WideString 32-битный указатель Да Variant 32-битный указатель Да Pointers 1 двойное слово Да Objects 32-битный указатель Да Class and Class reference 32-битный указатель Да Procedure pointer 1 двойное слово Да Method pointers Два 32-битных указателя (3) Нет Sets Значение типа байт/слово/двойное слово или 32-битный указатель (4) Да (4) Records Значение типа байт/слово/двойное слово или 32-битный указатель (4) (5) Да (4) Static Arrays Значение типа байт/слово/двойное слово или 32-битный указатель (4) Да (4) Dynamic arrays 32-битный указатель Да Open array Два 32-битных значения (6) Нет Single 4 байта Нет Double 8 байт Нет Extended 12 байт (7) Нет Real48 8 байт (8) Нет Currency 8 байт Нет (1) Если указано, то тип передается через регистр. Типы, которые не указаны, всегда передаются через стек. (2) Когда эти типы занимают менее 32 бит, тогда при передаче на стек они всегда занимают 32 бита, и значение находится в младшей части, содержимое оставшей части неопределено. 3) Указатели на метод передаются через стек, как два 32-битных указателя, указатель на экземпляр помещается перед указателем на метод, так что позже это становится младшим адресом. (4) Если тип помещается в байт/слово/двойное слово, то он передается непосредственно. Иначе, передается 32-битный указатель на память, где хранится этот тип. (5) При использовании соглашения по вызову типа cdecl, stdcall или safecall, записи всегда передаются через стек и их размер округляется в сторону большего двойного слова. (6) Первое значение это 32-битный указатель на массив, а второе значение содержит количество элементов в массиве. (7) Используются только младшие 10 байт. (8) Используется только младшие 6 байт. Таблица 3: Результаты возврата функций В следующей таблице приведен обзор того, как результаты возвращаются из функции в программу. Для более подробной информации насчет каждого типа, читайте соответствующий раздел. Тип Дельфи Результат Размер ShortInt al 8-битное значение SmallInt ax 16-битное значение LongInt EAX 32-битное значение Byte al Значение типа байт Word ax Значение типа слово Dword EAX Значение типа двойное слово Int64 EDX:EAX 64-битное значение Boolean al Значение типа байт ByteBool al Значение типа байт WordBool ax Значение типа слово LongBool EAX Значение типа двойное слово Char al Значение типа байт AnsiChar al Значение типа байт WideChar ax Значение типа слово ShortString Указатель в Result (1) 32-битный указатель AnsiString Указатель в Result (1) 32-битный указатель WideString Указатель в Result (1) 32-битный указатель Variant Указатель в Result (1) 32-битный указатель Pointers EAX 32-битный указатель Objects EAX 32-битный указатель Class and Class reference EAX 32-битный указатель Procedure pointer EAX 32-битный указатель Method pointers Указатель в Result (2) 2 x 32-битных указателя Sets EAX или Result (3) Непосредственно или как 32-битный указатель (3) Records EAX или Result (3) Непосредственно или как 32-битный указатель (3) Static Arrays EAX или Result (3) Непосредственно или как 32-битный указатель (3) Dynamic arrays Указатель в Result (1) 32-битный указатель Single ST(0) n/a Double ST(0) n/a Extended ST(0) n/a Real48 ST(0) n/a Currency ST(0) (4) n/a (1) Переменная Result в действительности передается в функцию, как дополнительный var параметр. Эта переменная Result содержит 32-битный указатель на область результата в памяти. Подлинное местонахождение зависит от типа использованного соглашения о вызове: Для соглашения register это может быть EAX, EDX или ECX, в зависимости от количества переданных параметров. В других случаях Result это 32-битный указатель на стеке. (2) Переменная Result указывает на адрес памяти где расположены два 32-битных указателя. Этот указатель передается так, как если бы он был действительно объявлен, и его точное местонахождение зависит от типа используемого соглашения о вызове. (3) Если подлинный тип помещается в 32 бита, то он возвращается напрямую через регистр al/ax/EAX. Иначе, Result содержит 32-битный указатель на переменную памяти, и он передается в функцию, как если бы он был объявлен как дополнительный 32-битный var параметр. Этот параметр (точное местонахождение зависит от типа использованного соглашения о вызове) должен содержать указатель на действительные данные в памяти (4) Значение в ST(0) является маштабированным значением (x10000). Для примера, значение 5,8745 возвращается как 58745.
Сайт рассылки Здесь Так же можете посетить несколько сайтов для заработка в Интернете: |
В избранное | ||