Показать сообщение отдельно
Старый 18.04.2002, 20:33   #5   
Модератор
 
Сообщений: 665
Регистрация: 09.01.2002

Kerish вне форума Не в сети
Post

Quench,вот материал с одного сайта,извини за перевод с английского.Переводил мой тупой электронный переводчик...

Смешивание Ассемблера с Visual Basic

Эта обучающая программа поможет объяснять основы и также подробности, необходимые, если Вы хотите смешать ассемблерный код с Visual Basic. Эта обучающая программа не будет объяснять, как использовать ассемблер. Если Вы должны узнать, что, то Вы можете находить много обучающих программ и помогать в другой трансляции(блоке) связанным сайтам. Код, используемый здесь сделан с NASM 0.97, который является свободно доступным на internet (но справка для этого не настолько общая(обычна)). Быть Предупредите однако: Смешивание ассемблерного кода с вашими программами visual basic может серьезно делать это намного тяжелее, чтобы отлаживать и использовать. Ошибка может легко вызывать полную среду Visual Basic на завершение, закреплять компьютер, делать GPF'S, и даже перезапускать компьютер (я нашел все ими из жесткого пути!). Не упоминать, что не имеется любых средств отладки что Вы можете использовать, чтобы установить проблемы. Фактически, если ваш ассемблерный код не восстанавливает все после того, как это сделано, вещи подобно использованию окна Debug в Visual Basic вмешаются, и заставят VB среду закрывать. Ассемблер может быть очень труден изучать и программировать. Однако, это может также быть проще в некоторых случаях(делах), потому что Вы добираетесь, намного лучше понимание что Вы делаете. Истинная история: я сначала запустил программировать с QBASIC. После использования QB для приблизительно 2 года я сделал трехмерный куб вращения. Я решил использовать Visual Basic после этого. Требуется меня 1-летний прежде, чем я мог записывать трехмерную программу в VB. Теперь, когда я знаю, как использовать это, требуется меня только 4 месяца, чтобы записать новую версию. Однако, требуется меня примерно 4 недели в целом, чтобы изучить все необходимый быть способно записать трехмерную программу в чистом ассемблере. Это - то, потому что я узнал точно, какой различные функции делали, так что я знал, точно как использовать их. Это доказывает, что ассемблер может быть намного более быстрый, чтобы учиться, даже чем QBASIC.
В чем Вы нуждаетесь:
* Visual Basic (я только пробовал с VB5, но VB4 или выше должен работать). Если Вы, dont имеют Visual Basic, то Вы можете получить Заказное Издание Управления бесплатно в сайте Microsoft. * NASM (я только пробовал с v0.97). Если Вы, dont имеют NASM, то Вы можете получить это бесплатно в NASM сайте. * простой текстовый редактор. Записная книжка удовлетворяет меня прекрасный, но Вы можете использовать то, что Вы хотите, пока это не размещает специальные символы форматирования в ваш текст.
Связи(ссылки):
*Get NASM (свободный) (http://www.cryogen.com/Nasm/) *Get СРЕДА СОВМЕСТНЫХ ВЫЧИСЛЕНИЙ Visual Basic VBA51 сайт (свободного) *Patrice Писца. Этот сайт показывает, как использовать DirectX с VB, используя Patrice Библиотеки Типа Писца. Это также показывает, как использовать ассемблер DLL'S в VB, смешанном с DirectX, становиться превосходным, быстро трехмерная графика. *Unlimited Факты. Сайт с некоторыми большими обучающими программами на графике и игре связал программы, включая обучающие программы при использовании метода доступа к пикселам изображений, как будто это был нормальный массив. При смешивании этого метода и трансляции(блока) DLL'S может показывать большим результатам. *VB Проводник. Хорошая страница для изучения VB *VB Помощник. Другая хорошая VB страница с многими советами(предупреждениями). *Hugo страница АССЕМБЛЕРА DOS Елиаса. Некоторая графика / игра связала страницы. *NASM справочный файл ("Nasmdoc.hlp")
*Newsgroups для программирования АССЕМБЛЕРА типа: comp.lang.asm.x86 alt.lang.asm comp.os.ms-windows.programmer.win32
*Newsgroups для VB, программирующего типа: microsoft.public.vb.winapi microsoft.public.vb.winapi.graphics Microsoft public.win32.programmer.gdi
*Search для ' программирование трансляции(блока) ' от любого механизма поиска (типа Lycos или Yahoo)
Использование NASM с VB:
Чтобы использовать NASM с Visual Basic, Вы должны делать DLL с NASM, и затем Вы можете использовать это, DLL с Visual Basic (VB3 не позволяет Вам использовать dll's). Вы можете использовать DLL'S, Вы сделали, тот же самый путь как будто Вас при использовании системы Windows DLL, типа 'user32.dll' или 'gdi32.dll'.
Делать DLL с NASM, имеются три шага в это: Вы сначала должны записать ваш код NASM, тогда Вы должны компилировать ваш код NASM и связывать это с компоновщиком Visual Basic. Тогда Вы можете использовать это с VB.
Например, здесь мы будем делать DLL, чтобы добавить два Длинных целого числа (DWords): Сохраните(экономьте) следующий код в текстовом редакторе как myDLL.asm в новый каталог, типа C:\VB5\samples\ASM: (если Вы собираетесь копировать и вставлять этот код отсюда, выберите это от левого края(ребра) этого окна, иначе переводы каретки будут наполнены.)


SEGMENT code USE32 GLOBAL _DllMain
;Just a small routine that gets called. _DllMain: moveax, 1 ;Dont worry about this. retn12
;
;Sub addLongs (ByRef number1 As Long, ByVal number2 As Long) GLOBAL addLongs addLongs: enter 0, 0 move ax, [ebp+8]
;pointer to number1 move cx, [eax]
;ecx = number1 adde cx, [ebp+12]
;ecx = number1 + number2 mov [eax], ecx
;number1 = number1 + number2 leave retn 8
;return, with 8 bytes of arguments (2 DWords)
ENDS

Первые средства строки сообщают NASM, что это является 32 разрядной программой Windows. Это ДОЛЖНО БЫТЬ во всех вашем DLL'S, перед любым кодом. Вторая строка сообщает компоновщику, что _DLLMain будет глобальное название(имя). Компоновщик позволит тому названию(имени) называться Visual Basic. Вы должны объявить все ваши процедуры как ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ, иначе они привычка, которому б замечены Visual Basic. Третья строка имеет название(имя) (метка), называемая _DllMain, так, чтобы компоновщик знал, где _DllMain. Две строки программы, что _DllMain просто при создании eax равняться 1, при удалении 12 байтов для его параметров и затем при возвращении кто бы ни то, назвал подпрограмму. Это - специальная подпрограмма, относительно которой Вы dont должны волноваться. Первая строка 2-ых стандартных запусков с a; (точка с запятой), чтобы показать той остальной части строки - инструкция замечания, точно так же как ' (apostraphe) делает в Visual Basic. Строка должна только там показать тому, как что это назвалось бы в Visual Basic. Обратите внимание, что первый параметр пропускает ссылка(справочники), в то время как другой параметр пропускает значение. Это означает, что фактическое расположение памяти первого параметра послано, и фактическое значение второго параметра послано. Первая переменная послана ссылкой(справочниками), так, чтобы это могло быть изменено(заменено). Второй переменный косяк, быть изменено(заменено) этой подпрограммой, потому что мы только имеем ее значение, но мы имеет фактическое расположение первой переменной, потому что это пропускает ссылка(справочники). Вторая строка (2-ой подпрограммы) показы, что addLongs также собирается быть меткой что Visual Basic будет способен видеть. Третья строка показывает, где addLongs. Четвертая строка сохранит(будет экономить) регистр ebp, и заставлять это указывать на начало стека вызовов. (Это только необходимо, если Вы собираетесь использовать параметры). EBP теперь направит на вещи подобно адресу памяти вызывающей программы, и также параметры, которые были посланы. EBP+8 укажет на первый параметр. Так как Windows 9x - 32 бит, каждый параметр должен быть 32 бита, который является 4 байтами. Так как параметры - один за другим, тогда следующий параметр будет в EBP+12, и третий параметр будет в EBP+16, затем в EBP+20, и т.д ... пятая строка заставит регистр ЭЛЕКТРОННОГО КОММУТАТОРА равняться первому параметру. Так как первый параметр пропускала ссылка(справочники), ЭЛЕКТРОННЫЙ КОММУТАТОР будет равен расположению в памяти, где первая переменная сохранена. Шестая строка заставит регистр ECX равняться значению первого параметра. Седьмая строка добавит значение второго параметра к ECX, и так что ECX будет тогда проводить(держать) значение первого параметра плюс второй параметр. Строка eigth заставит первую переменную, которая будет равняться ECX, который был эти два числа(номера), добавленные вместе. Поэтому 'number1', который используется программой в Visual Basic, будет теперь иметь 'number2', добавленный к этому. Секунда, которую последняя(прошлая) строка подпрограммы отменит, что вводит, делала. Это должно использоваться в подпрограмме, если вводят, использовался. Последняя(прошлая) строка 2-ой подпрограммы отмечает конец подпрограммы, и это возвратит назад вызывающей программе (Visual Basic), и это должно также показать количеству байтов параметра, которые были посланы этому. Самая последняя(прошлая) строка (КОНЦЫ) означает, что это - конец всего вашего кода для файла.
Как только это все напечатано (названия(имена) с учетом регистра в NASM!) и сохраненный, готово быть откомпилированным. Чтобы компилировать это, я сделал пакетный файл в том же самом каталоге, называемом "MakeDLL.bat", чтобы автоматически напечатать параметры для компилирования DLL'S, и я помещал следующее в это:
C:\Nasm\NasmW.exe -f coff myDLL.asm C:\VB5\Link.exe /dll /export:addLongs /entry llMain myDLL.o del myDLL.exp del myDLL.lib del myDLL.o
Первые две строки - важные, но последние(прошлые) три строки удалят потраченные впустую файлы, если Вы dont используете их. Первая строка компилирует ваш ассемблерный код. Параметры к этому говорят, что это должно быть откомпилировано к формату COFF, который является форматом, который компоновщик Visual Basic использует. Очевидно, Вы должны заменить каталог NASM (в коричневом) с каталогом, где это находится на вашем компьютере. Если Вы хотели видеть машинную распечатку кода вашего DLL, то Вы можете также добавлять ' -l myDLL.lst ' на конец первой строки. Вторая строка свяжет ваш формат '.o COFF ' файл в '.dll ' файл, который может использоваться с Visual Basic. Первый параметр '/dll ' сообщает этому делать это DLL файлом. Без этого, это будет делать EXE файл. После того, как это, /export:addLongs говорит, что название(имя) ' addLongs будет видимо к Visual Basic. Вы должны делать это для каждой из ваших подпрограмм в DLL, иначе привычка Visual Basic быть способными найти их. Следующий параметр '/entry llMain ' говорит, где, что имеется ' DLLMain ' подпрограмма. Это должно всегда использоваться. Последний(прошлый) параметр ' myDLL.o ' должен всегда быть там, показывать какой файл связаться. Очевидно, Вы должны заменить каталог, данный здесь (в коричневом) с каталогом Visual Basic на вашем компьютере, который должен иметь файл, называемый ' link.exe '. Это должно компилировать и связывать ваш файл АССЕМБЛЕРА в DLL файл. Использование пакетного файла подобно этому может быть очень удобно, потому что Вы будете должны выполнить это, каждый раз Вы делаете любую модификацию к вашему коду ассемблера. Очевидно, чтобы использовать компилируют различный NASM файл, Вы были бы должны измениться везде, где это говорит ' myDLL ' к тому, что новый файл называется, и изменять(заменять) '/export ' подпрограммы. Как только Вы имеете, сохраняют(экономят) этот пакетный файл, Вы можете выполнять это. Много сообщений подойдут на экран, в то время как это компилирует и соединение. Вы должны статься знакомыми с тем, что это говорит, когда все работает, так что Вы можете быстро сообщить, когда кое-что пошло не так, как надо. (Dont волнуются, говорит ли компоновщик, что '_DllMain ' - не ' __ stdcall ' с 12 байтами параметров. Я могу только избавляться от этого, делая EXE файл вместо DLL файла). Вы должны теперь иметь файл, называемый " myDLL.dll "
Вы можете теперь использовать DLL в Visual Basic, точно так же как любой другой DLL. Делайте новый проект EXE в Visual Basic. Сохраните(экономьте) это в тот же самый каталог как DLL файл, который Вы сделали. Напечатайте следующее:

Option Explicit
Private Declare Sub addLongs Lib "samples\ASM\myDLL" (ByRef number1 As Long , ByVal number2 As Long)
Private Sub Form_Click()
Dim x As Long, y As Long
x = 200
y = 5
Print "x = "; x
Print "y = "; y
addLongs x, y
'If it reached this line, then its probably perfect.
Print "Added y to x, so now x = "; x
'The answer better be 205, otherwise you stuffed something up! End Sub

Надеюсь это тебе поможет!

[ 18-04-2002: Сообщение отредактировал: DrIQ ]</p>
  Ответить с цитированием