Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Всем кому небезразлична судьба ассемблера в VB, посмотрите пример подготовительного проекта. Сам проект http://basicproduction.nm.ru/ASM/VBASMPRJ.rar Что вы думаете насчёт принятия участия в этом проекте? Я не несу никакой личной выгоды для себя. Просто хочется ускорить программы, написанные на VB. Проект можно разместить на этом или любом другом сайте по договорённости. Если вам не интересна эта идея - напишите соображения почему.
Вопрос: Проект Ассемблер в VB
Добавлено: 11.06.04 21:13
Автор вопроса: @CyRax PTR | Web-сайт:
http://basicproduction.nm.ru/ASM/BPASM.rar
Ассемблер предоставляет безграничные возможности для творчества и повышает скорость ваших алгоритмов. Да хоть новый БЕЙСИК написать внутри VB.
А те кто не любят АСМ могут просто вызывать листинги или бинарники написанные другими. Если проект получит развитие, то можно будет создать и пополнять библиотеку машинных функций для VB6. Конечная цель - он станет стандартом для VB. Хотя бы в рунете.
Ответы
Всего ответов: 77
Номер ответа: 1
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #1
Добавлено: 11.06.04 22:14
То что уже есть сделано тобой?
Номер ответа: 2
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #2
Добавлено: 11.06.04 22:20
сам аддон
http://www.persistentrealities.com/files/inlineasm.zip
Тут читать
http://www.persistentrealities.com/vbfibre/index.php?category=0&item=5&t=asm
Уже всё довно есть ... вот прсотон никак найти не мог... сурс код вложен...
вот так выгледить будет примерно ....
Public Sub asmSinCosPointer(ByRef sngCosAngle As Single, ByRef sngSinAngle As Single)
'#ASM_START
'.MMX
' push ebp
' mov ebp, esp
' mov eax, DWORD PTR [ebp+8] ;'//First argument, store in eax (= value now!)
' fld dword ptr [eax] ;'//Get value for cos
' fsincos ;'//Execute sin/cos instruction
' fstp dword ptr [eax] ;'//Store cos in eax (1st param pointer!)
' mov eax, DWORD PTR [ebp+12] ;'//Second argument, store in eax (=value now!)
' fstp dword ptr [eax] ;'//Store sin in eax (2nd param pointer!)
' mov esp, ebp ;'//MOV/POP is much faster
' pop ebp ;'//on 486 and Pentium than Leave
' ret 8
'#ASM_END
End Sub
плюс аддон даёт много чего другого
Номер ответа: 3
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #3
Добавлено: 11.06.04 22:22
Чего-то не удаётся скачать, проверь ссылку, а?
Выкидывает на Online Resource Center, оттуда на пустую страницу с одной ссылкой, а по ней снова на Online Resource Center. И так по обеим ссылкам по кольцу гоняет.
Номер ответа: 4
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #4
Добавлено: 11.06.04 22:22
Такие как откомпилить консольное приложение или РЕАЛЬНУЮ ДЛЛ
Номер ответа: 5
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #5
Добавлено: 11.06.04 22:25
У меня всё качается и всё октрывается...
Номер ответа: 6
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #6
Добавлено: 11.06.04 23:12
cresta,
не открывай в новом окне. А лучше сразу кидай ссылку в диспетчер закачек.
Fallout,
да, написано мной. На английские надписи не обращай внимания. Это привычка с PB Navigator (кстати разработку его я прекращать не собираюсь).
Не, ну конечно крутизну типа встраивания в IDE врядли будем делать (хотя как знать), а возможности такие:
Запуск бинарника из строки, файла, ресурса. Подержка бинарников настоящих АСМ (у меня есть бинарник только на NASM). Компиляция налету (нужно таскать компилятор в программе). Сам компилятор написан на VB, поэтому никаких заморочек с пришиванием рантайма не нужно. Компилятор ведь в исходниках. Хочу ещё сделать поддержку русских мнемоник типа (ШЛИ АКК,СЧЕ или ПЕРЕШЛИ АККУМУЛЯТОР, СЧЁТЧИК и т.д.), но это для новичков. А представьте если хранится скажем у вас исполнимый код в виде мнемоник внутри программы? Его ж ни один антивирусник не определит. Представляете как легко модифицировать такой код? Но это для хакеров, а для созидателей можно понаписывать кучу библиотек или написать внутренний язык. Я кстати сравнивал цикл с PB-шным на 2 Млрд. Так VB АСМ ещё и выиграл 0.1 (1 десятую) секунды.
Если тот в исходниках, то можно оттуда кода наворовать. Хотя если никто не проникнется этой идеей, то я один её поддерживать не буду - денег она всё равно не принесёт.
Номер ответа: 7
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #7
Добавлено: 11.06.04 23:22
2@CyRax PTR хорошая работа...
Правдо при таком аддоне разве нужно что то ещё делать?... он компилит реальный асм.... да и ещё много чего
Номер ответа: 8
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #8
Добавлено: 12.06.04 00:28
Кому как больше нравится. К этому инлайну ещё и MASM качать можно. Т.е. он компилит только в дизайн-тайме. Конечно он профессиональный (наверное), но идея несколько другая. Т.е. одно другому не мешает. Мой - это чистый ассемблер. Ну да ладно, я же не настаиваю. Конечно аддон лучше. Это значит что тебе идея не понравилась?
Номер ответа: 9
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #9
Добавлено: 12.06.04 00:30
>К этому инлайну ещё и MASM качать можно.
Опечатка. Надо.
К этому инлайну ещё и MASM качать НУЖНО.
Номер ответа: 10
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #10
Добавлено: 12.06.04 00:42
Хм... Идея интересная Так можешь дойти и до программирования в HEX кодах Или до PowerBasic'a уже не далеко
Т.е. как я понял ты хочешь повсюду таскать этот компилятор в ехе, и при необходимости, собирать из мнемоники на лету асьмовый код... А что если параметров будет более четырех, что тогда ???
А все-таки зачем делать свой компилятор, если можно воспользоваться, как в inlineasm микрософтовским, коли не секрет?
Номер ответа: 11
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #11
Добавлено: 12.06.04 00:48
Компилятор таскать по желанию. Посмотри исходник.
Модуль BPEXEC. Ведь он запускает уже компилированный файл. Ты можешь откомпилировать, а затем сохранить в текстбоксе(или ресурсе) или исходник или бинарник. Для исходника нужен компилятор, а для бинарника нет. Т.е. по выбору.
Кому что в голову взбредёт.
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 12.06.04 01:11
С этим то все ясно А вот как на счет если параметров нужно передать в функцию более 4-х ???
Может стоит написать свою функцию ??? По идее это не так сложно (если я ее назначение верно понимаю):
Запушить нужное кол-во параметров
вызвать функцию по адрессу
Номер ответа: 13
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #13
Добавлено: 12.06.04 01:55
О 4-х параметрах: тут есть статья как вызывать CallWindowProc более чем с 4-мя параметрами, может пригодится, гляньте: http://www.vbstreets.ru/VB/Articles/65976.aspx
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 12.06.04 02:10
Думаю, это то что надо: (а может и нет ) - к статье прилагается проект и оттуда:
Public Function CallFunction(ByVal FuncName As String, ByRef FuncPointer As Long, ByVal ParamsCount As Long, Optional ByVal p1 As Long = 0, Optional ByVal p2 As Long = 0, Optional ByVal p3 As Long = 0, Optional ByVal p4 As Long = 0, Optional ByVal p5 As Long = 0, Optional ByVal p6 As Long = 0, Optional ByVal p7 As Long = 0, Optional ByVal p8 As Long = 0, Optional ByVal p9 As Long = 0, Optional ByVal p10 As Long = 0) As Long
'Сделаем так:
' - если FuncPointer = 0, то проиходит вызов FuncName, а через
' FuncPointer возвращается указатель на эту функцию.
' - если FuncPointer <> 0, то происходит вызов этого самого FuncPointer,
' а FuncName игнорируется.
 im i As Long, t As Long
 im hGlobal As Long, hGlobalOffset As Long
If ParamsCount < 0 Then Err.Raise 5 'invalid call
If FuncPointer = 0 Then
FuncPointer = GetProcAddress(m_hLib, FuncName)
If FuncPointer = 0 Then Err.Raise 453 'function not found
End If
'Фишка первая: благодаря GlobalAlloc мы сразу имеем dword-aligned кусок памяти
'5 байт для запихивания каждого нашего параметра в стек
'5 байт - добавить вызов нашей функции
'3 байта - почистить стек при cdecl
'3 байта - ret 0x0010, выпихивая при этом и параметры CallWindowProc
'1 байт - выравнивание, поскольку последний PutMem4 требует 4 байта.
hGlobal = GlobalAlloc(GMEM_FIXED, 5 * ParamsCount + 5 + 3 + 3 + 1) 'Заполняем всё подряд, ZEROINIT не нуно.
If hGlobal = 0 Then Err.Raise 7 'insuff. memory
hGlobalOffset = hGlobal
'Фишка вторая: у нас ведь подряд идущие byval long параметры...
'А знаете ли вы, что у них подряд идущие varptr?
'А что из этого следует, гы-гы-гы?
If ParamsCount > 0 Then
t = VarPtr(p1)
For i = ParamsCount - 1 To 0 Step -1
PutMem2 hGlobalOffset, asmPUSH_imm32
hGlobalOffset = hGlobalOffset + 1
GetMem4 t + i * 4, hGlobalOffset 'я долго этим гордился
hGlobalOffset = hGlobalOffset + 4
Next
End If
'Добавляем вызов функции
PutMem2 hGlobalOffset, asmCALL_rel32
hGlobalOffset = hGlobalOffset + 1
PutMem4 hGlobalOffset, FuncPointer - hGlobalOffset - 4
hGlobalOffset = hGlobalOffset + 4
If m_CallType = eCDecl Then
PutMem2 hGlobalOffset, &HC483 'add esp, imm8
hGlobalOffset = hGlobalOffset + 2
PutMem2 hGlobalOffset, ParamsCount * 4 'собственно imm8
hGlobalOffset = hGlobalOffset + 1
End If
PutMem4 hGlobalOffset, &H10C2& 'ret 0x0010
CallFunction = CallWindowProc(hGlobal, 0, 0, 0, 0)
GlobalFree hGlobal
End Function
Номер ответа: 15
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #15
Добавлено: 12.06.04 03:04
Видел... что-то уж больно там запутано... или я совсем дурак
К примеру я не понял почему так, а не иначе:
'Фишка первая: благодаря GlobalAlloc мы сразу имеем dword-aligned кусок памяти
'5 байт для запихивания каждого нашего параметра в стек
'5 байт - добавить вызов нашей функции
'3 байта - почистить стек при cdecl
'3 байта - ret 0x0010, выпихивая при этом и параметры CallWindowProc
'1 байт - выравнивание, поскольку последний PutMem4 требует 4 байта.
Я не понял сущности этого цикла:
For i = ParamsCount - 1 To 0 Step -1
PutMem2 hGlobalOffset, asmPUSH_imm32
hGlobalOffset = hGlobalOffset + 1
GetMem4 t + i * 4, hGlobalOffset 'я долго этим гордился
hGlobalOffset = hGlobalOffset + 4
Next
Что-то он намудрил совсем... Откуда он эту инфу взял?