стрельба по-македонски ДМИТРИЙ КОВАЛЕНКО Спецвыпуск: Хакер, номер #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 файлов. |