|
|||||||||||||||||||||||||||||||||
Автор: GPcH. Дата публикации: 13.05.2004 |
Вставка ассемблерных процедур в код Visual Basic: миф или реальность?Введение Знатоки таких языков высокого уровня, как Delphi и C++, сейчас скажут, что только данные языки способны воспринимать низкоуровневые конструкции, причем ключевого слова Asm вполне достаточно. Частично с этим утверждением можно согласиться – в VB так просто встроить Asm нельзя, но поверьте, прочитав данную статью для Вас это будет также просто сделать и на VB. Для начала рассмотрим методику вставки. Для вызова ассемблерного кода используется API функция “CallWindowProc”, содержащаяся в библиотеке "user32.dll", которая входит в поставку винды. Она имеет 1 основной и 4 дополнительных параметра. В первый мы будем передавать адрес первой ячейки массива, содержащего массив байт (откомпилированную ассемблерную процедуру), а в остальные – параметры, необходимые для работы ассемблерной функции. Для начала создадим новый проект и объявим эту функцию:
Теперь создадим функцию, которая преобразует HEX строку машинных кодов в байтовый массив и возвратит адрес первой ячейки массива:
Теперь перейдем непосредственно к созданию ассемблерной функции. Подготовка ассемблерного кода При создании новой функции будем использовать следующий шаблон:
Комментарий: первый параметр, передаваемый функции всегда находится по адресу ebp+8, остальные в зависимости от их длины расположены дальше ebp+8. Строки передавать в функцию нельзя (так как они в Unicode. И вообще, при работе с ними, все начинает глючить). Также компилятор nasmw не понимает db, посему работать с переменными, созданными в этой функции вам тоже не получится. И самое обидное: API использовать также нельзя. При вызове более 2-х параметров, в конце функции необходимо вместо ret ставить ret 8 при использовании 3-х параметров и ret 8+<длина параметра(чаще всего 4)> при использовании 4-х параметров. Теперь у Вас возникнет вопрос: “Как это все теперь перевести в HEX строку, которую мы будем передавать ранее написанной функции?”. Резонный вопрос. Для начала необходимо перевести этот ассемблерный код в BIN файл, содержащий машинные коды, для чего можно использовать nasmw – компилятор ассемблера (командная строка: nasmw.exe -f bin YouProgram.asm -o YouProgram.bin), а затем написать небольшую программку для перевода BIN файла в HEX строку. Я же рекомендую не геморроиться и использовать написанную мной прогу Asm to VB, которая без проблем переведет код, написанный по вышеприведенному шаблону в BIN файл или HEX строку. В Asm to VB я уже встроил компилятор nasmw, поэтому кроме этой программы для написания ассемблерных функций Вам ничего не потребуется. Добавление ассемблерных процедур в код на Visual Basic 6.0 Мы имеем Hex строку и имеем функцию, передавая в которую Hex строку она создает массив машинных инструкций и возвращает ссылку на первую ячейку массива. Поверьте этого достаточно. Теперь запустим функцию с параметрами (если в функцию передаётся не 4, а меньше параметров, то остальные параметры забиваются нулями, если этого не сделать, функция не будет работать!), предварительно присвоив переменной sHex Hex строку, которую мы получили в предыдущем шаге:
Теперь мы имеем в переменной sRetVal результат работы функции. PS: Вот так вот все просто. Желаю удачи!
|
|
| ||||||||||||||||||||||||||||||