Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

стрельба по-македонски

ДМИТРИЙ КОВАЛЕНКО

Спецвыпуск: Хакер, номер #071, стр. 071-040-3


Как и в inline-ассемблере Visual C++, в inline-ассемблере Delphi нельзя определять переменные и структуры. Однако можно использовать константы, переменные и записи, уже определенные в программе (смотри листинг 8). При написании кода на inline-ассемблере Delphi нужно соблюдать те же предосторожности, что и в inline-ассемблере Visual C++. Пожалуй, единственная разница заключается в том, что нельзя изменять регистры edi, esi, esp, ebp и ebx. А вот регистры eax, ecx и edx можно изменять свободно.

Обычно на inline-ассемблере Delphi пишутся функции. При написании функций следует учитывать некоторые особенности. Во-первых, все параметры, занимающие в памяти больше 4 байтов, передаются в функцию так, как если бы перед ними стояли директивы var (даже если эти директивы не указаны). Во-вторых, результат функции должен возвращаться в eax.

Типичная функция выглядит примерно так:

{умножение X*Y}

function LongMul(X, Y: Integer): Longint;

asm

mov eax,X

imul Y

end;

[OBJ-модули.]

Мы не будем подробно останавливаться на OBJ-модулях, их упоминание здесь – скорее дань традиции. В славные времена MS DOS OBJ-модули были чуть ли не единственным способом использовать одновременно несколько языков программирования.

Если кто не в курсе, OBJ-модуль – это файл с расширением .obj. В OBJ-модуле в специальном формате содержится машинный код, обычно - набор каких-то полезных функций. Функции из OBJ-модулей можно вызывать из программ на Visual C++ и Delphi. Создавать OBJ-модули можно с помощью компиляторов тех же Visual C++ и Delphi. Таким образом, OBJ-модуль, написанный на Visual C++, теоретически может использоваться в программах на Delphi и наоборот.

Но это теоретически: на практике форматы OBJ-модулей, генерируемых Visual C++ и Delphi, несовместимы между собой. Кроме того, в Visual C++ и Delphi по умолчанию приняты разные соглашения о передаче параметров в функции. Это значит, что компиляторы Visual C++ и Delphi по-разному вызывают функции из OBJ-модулей и генерируют для этого принципиально разный машинный код. Отсюда возникает масса всяких нюансов, описание которых занимает не одну страницу (если кого-то интересуют подробности, можно посмотреть книгу В. Юрова «Assembler. Учебник»).

Короче, во времена MS DOS OBJ-модули были отличной штукой, но сейчас это не самый простой способ программирования на нескольких языках.

[межпрограммное взаимодействие.]

Выше мы обсуждали, как «подружить» в одной программе куски кода, написанные на разных языках программирования. Сейчас мы поговорим о том, как «подружить» между собой программы, написанные на разных языках. Под «подружить» имеется ввиду «научить разные программы обмениваться между собой данными».

Начнем с того, что в Windows у каждого процесса есть свое адресное пространство, недоступное другим процессам. С одной стороны, это хорошо – каждый процесс работает в своем адресном пространстве и не мешает другим процессам. С другой стороны, это плохо, потому что если одна программа хочет передать другой какие-то данные, она не может сделать это напрямую через память. Одним из самых простых решений в этой ситуации является использование memory-mapped файлов.

Назад на стр. 071-040-2  Содержание  Вперед на стр. 071-040-4