Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.160.16] |
|
Сообщ.
#1
,
|
|
|
Можно ли в VB использовать асемблеровские вставки?
|
Сообщ.
#2
,
|
|
|
Цитата miksayer @ 15.11.04, 12:47 Можно ли в VB использовать асемблеровские вставки? Вроде не маленький уже. Должен и сам знать... |
Сообщ.
#3
,
|
|
|
я нашел вот такое:
Цитата Суть метода заключается в том, чтобы хранить уже скомпилированный код в виде константы. Каким образом это реализуется? Ниже приведена измененная мною выдержка из кода с моими пояснениями. Листинг – пример использования хранимых функций Private Const ASMCode As String = "5589E581EC780000005756538B5D0 ...” ‘шестнадцатеричное значение сильно сокращено с целью экономии места Call LoadMCodeFromString (MyFunc, ASMCode) ‘ вызов функции преобразования ‘ Так как VB по умолчанию передает параметры ByRef - мы получаем массив MyFunc Private Function LoadMCodeFromString(asm_code_ARRAY() As Byte, MCODE As String) Dim i As Long, aSize As Long aSize = Len(MCODE) ' размер кода Debug.Assert Not aSize And 1 ' число не может быть четным aSize = aSize \ 2 ReDim Preserve asm_code_ARRAY(0 To aSize - 1) ' подготавливаем массив For i = 0 To aSize - 1 asm_code_ARRAY(i) = Val("&H" & Mid$(MCODE, i * 2 + 1, 2)) 'создаем массив Next End Function ptMf = VarPtr(MyFunc(0)) ' получаем адрес первого элемента, он же и будет адресом нашей процедуры CallWindowProc pMf, ... параметры но мне нужно, чтобы можно было код на ассемблере использовать как в VC при помощи конструкции asm или ей подобной SCINER, но я не знаю! |
Сообщ.
#4
,
|
|
|
Это нереально! Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc...
|
Сообщ.
#5
,
|
|
|
хммм очень даже ничего мысля.
вот только нужно мозгами раскинуть как это будет выглядеть... |
Сообщ.
#6
,
|
|
|
Цитата Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc... а вообще реально такой адд-ин написать? |
Сообщ.
#7
,
|
|
|
Если поднатужиться и время найти бы, то может и реально.
У кого нибудь есть простинкая библиотека на асме, буквально 2+2? и чтоб результат верНула? Идея посетила меня... Добавлено перевести написаный код допустим в: ' #Asm ' mov ecx, elemscount ' jecxz @getout ' mov edx, pArrData ' xor eax, eax ' '@start: ' dec ecx ' add eax, dword ptr [edx+ecx*4] ' cmp ecx, 0 ' jne @start '@getout: ' #End Asm почему как коментарий ? Потому что если писать открыто то компилятор начнет материться как не нормальный. Этот кусок откомпелировать и загнать в .exe или .dll по сути дела не проблема. Проблема как и куда это дописать. Есть варианты такие, делать как выше сказано, хранить уже хекс в константе, либо делать так: допустим есть функция Public Function TestAsm(a as Integr, b as Integer) 'и тут писать вставку на асме End Function потом вставка компилируется асмом, создается dll'ка и дописывается по этому адресу. Но здесь есть большое НО... Где гарантия что адреса совпадут? Т.е. вызов функции VB и фнкции ASM Dll могут иметь не много разные значения. Или в этой функции (VB) положить константу с хексом функции на асме... Но не знаю тут просто нужно подумать как следует. Добавлено Хммм ребят а обязательно ее вшивать? может рядом положить? |
Сообщ.
#8
,
|
|
|
)) Мне удалось интегрировать функции написаные на Visual C++, откомпилировать, и записать блиотеку. Пока она лежит рядом.
Вот что касается асма, то мое маленькое достижение поможет писать на асме в среде Visual Basic т.к. всем известно что в С++ встроен асм.) Ввыглядит это примерно вот так: в модуле пишем: '#_CPP [DLL: CPP_DLL] ' #include <windows.h> ' #include <string.h> ' #include <ole2.h> ' BYTE _stdcall TestByte( BYTE a, LPBYTE b ) ' { ' *b = a + a; ' return( *b + a ); ' } '#End _CPP Прописываем библиотеку тоже в каком-нибудь модуле: Public Declare Function TestByte Lib "CPP_DLL.dll" (ByVal a As Byte, ByRef b As Byte) As Byte ' Имя библеотеки CPP_DLL.dll потому что мы ввели параметр #_CPP [DLL: CPP_DLL], 'таким образом можно создавать не сколько библеотек в одном модуле... и в кнопку пишем вот такую гадость Private Sub Command1_Click() Dim bytA As Byte Dim bytB As Byte Dim bytC As Byte bytA = 17 bytC = TestByte(bytA, bytB) Print bytA, bytB, bytC End Sub И все работает. Но не обошлось и без багов, т.е. нужно задержать компеляцию VB модулей, а то VC++ не успевает создать библеотеку и тут конечно вылезает ошибка. Если кото знает как отследить начало компиляции или как искуственно запустить начало компиляции VB проекта, т.е. при нажатии на собственную кнопку начинается компиляция и запуск проекта. Не оставьте без совета... |
Сообщ.
#9
,
|
|
|
maxim84_, ну это не асм вставки - это исп. длл с асмом
|
Сообщ.
#10
,
|
|
|
Компилировать модули с ASM функциями PowerBasic компилятором.
PS Это только мысль, ничем не подтвержденная и не проверенная. |
Сообщ.
#11
,
|
|
|
SCINER, а я уж хотел спросить... Работает ли?
|
Сообщ.
#12
,
|
|
|
Простите за мою темнату в зании PB, а он умеет компелировать асем?
Цитата maxim84_, ну это не асм вставки - это исп. длл с асмом А пример приведеный выше разве не является примером использования dll с асмом? я просто не смог вырезать вункцию из скомпелированной dll'ки и вставить ее в .exe! |
Сообщ.
#13
,
|
|
|
maxim84_, Ладно, старался на +
|
Сообщ.
#14
,
|
|
|
Приколитесь, даже в батнике реально забацать библиотеку.
Юзать так: Private Declare Sub Function1 Lib "dll.dll" () Private Sub Command1_Click() Function1 End Sub Прикреплённый файлbat.dll.zip (2.17 Кбайт, скачиваний: 107) |
Сообщ.
#15
,
|
|
|
SCINER, Я чето непонял... там асм в bat файле???
|
Сообщ.
#16
,
|
|
|
Цитата SCINER, Я чето непонял... там асм в bat файле??? ну, и я тож ни че не понял |
Сообщ.
#17
,
|
|
|
Цитата А пример приведеный выше разве не является примером использования dll с асмом? я просто не смог вырезать вункцию из скомпелированной dll'ки и вставить ее в .exe! Я вообще-то и не понял даже где там асм... #_CPP [DLL: CPP_DLL] #include <windows.h> #include <string.h> #include <ole2.h> BYTE _stdcall TestByte( BYTE a, LPBYTE b ) { *b = a + a; return( *b + a ); } #End _CPP Ето что-ли? Функция выглядела бы: Int _stdcall TestByte( BYTE a, LPBYTE b ) { int c; __asm{ mov al,a mov bl,b add al,bl moc c,eax } return (c); } #End _CPP Понапридумывают... |
Сообщ.
#18
,
|
|
|
але! ты читать у меешь??
Цитата Вот что касается асма, то мое маленькое достижение поможет писать на асме в среде Visual Basic т.к. всем известно что в С++ встроен асм.) Где там SCINER? Ты хотел компилить только асемовские вставки?асем то компилить мона - это без вопросов, вот только как это пристрастить к VB? смутно представляю раскажи по подробней о своей идеии |
Сообщ.
#19
,
|
|
|
Цитата раскажи по подробней о своей идеии у него может и идей нету |
Сообщ.
#20
,
|
|
|
Цитата Andrey_Kun @ 16.11.04, 15:24 SCINER, Я чето непонял... там асм в bat файле??? Это ниже чем асм. Это самое низкоуровневое программирование. Ниже некуда. Это машинные коды! Добавлено Цитата miksayer @ 16.11.04, 18:36 Цитата раскажи по подробней о своей идеии у него может и идей нету Идея есть. 1. Линкер. Ему указывают из каких файлов собрать экзешку. Это можно увидеть, если перехватить его командную строку. Она выглядит примерно так: \link.exe "C:\My Downloads\Hide_From\icanhide\icanhide.OBJ" /ENTRY:__vbaS /OUT:"C:\My Downloads\Hide_From\icanhide\icanhide.exe" /BASE:0x400000 /SUBSYSTEM:WINDOWS,4.0 /VERSION:1.0 /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078 /OPT:NOWIN98 "C:\Program Files\SCINSpy\SSButton.OBJ" "C:\Program Files\SCINSpy\SSTabStrip.OBJ" "C:\Program Files\SCINSpy\modPrinter.OBJ" "C:\Program Files\SCINSpy\SSListViewReport.OBJ" "C:\Program Files\SCINSpy\modLogBase.OBJ" "C:\Program Files\SCINSpy\SCINSpy.OBJ" "C:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /OUT:"C:\Program Files\SCINSpy\SCINSpy.exe" /BASE:0x400000 /SUBSYSTEM:WINDOWS,4.0 /VERSION:6.1 /INCREMENTAL:NO /OPT:REF /MERGE:.rdata=.text /IGNORE:4078 /OPT:NOWIN98 Т.е. туча файлов с расширением *.OBJ А что будет если один из них подменить своим. Но скомпиленным PB ?? Если конечно PB создает OBJ файлы. |
Сообщ.
#21
,
|
|
|
я тут начал разбор полетов с компилятором c2.exe
вот, что пока из этого выходит: Сперва ОБЯЗАТЕЛЬНО прочтите Readme! Прикреплённый файлvb2asm.zip (1.51 Кбайт, скачиваний: 163) |
Сообщ.
#22
,
|
|
|
Цитата BYTE _stdcall TestByte( BYTE a, LPBYTE b ) maxim84_, у тебя эта ф-я экспортировалась ?? не верю... вот так должно экспортироваться extern "C" __dllspec(dllexport) __stdcall TestByte( BYTE a, LPBYTE b ) И действительно, если кому то нужны вставки на асме пусть пишет длл на С, не очень удобно конечно, не не менее, чем писать вставки на асме... А вообще, чего вам сдался этот асм, это ж отстой, только для понта разве что... реального применения практически нет... рельно полезных асм вставок единицы, и все они уже написанны до нас... |
Сообщ.
#23
,
|
|
|
Цитата рельно полезных асм вставок единицы, и все они уже написанны до нас... Вот если бы они ещё волялись всюду |
Сообщ.
#24
,
|
|
|
Цитата А вообще, чего вам сдался этот асм, это ж отстой, только для понта разве что... реального применения практически нет... рельно полезных асм вставок единицы, и все они уже написанны до нас... а, например, узнать тактовую частоту процессора и вообще можно много чего узнать |
Сообщ.
#25
,
|
|
|
Цитата а, например, узнать тактовую частоту процессора и вообще можно много чего узнать Ага, много всего, только это по большому счёту бесполезная информация... Асмовые вставки, насколько я знаю в основном используют в графике... Цитата Вот если бы они ещё волялись всюду __inline void MyFtoL(int *i, float f ) { __asm fld f; __asm mov edx, I __asm fistp [edx]; } /********************************************************************* ulSqrt.cpp Copyright (C) 1999, 2000 NVIDIA Corporation This file is provided without support, instruction, or implied warranty of any kind. NVIDIA makes no guarantee of its fitness for a particular purpose and is not liable under any circumstances for any damages or loss whatsoever arising from the use or inability to use this file or items derived from it. Comments: *********************************************************************/ #include <stdio.h> #include <math.h> #include <windows.h> static float _0_47 = 0.47f; static float _1_47 = 1.47f; float __fastcall ulrsqrt(float x) { DWORD y; float r; _asm { mov eax, 07F000000h+03F800000h // (ONE_AS_INTEGER<<1) + ONE_AS_INTEGER sub eax, x sar eax, 1 mov y, eax // y fld _0_47 // 0.47 fmul DWORD PTR x // x*0.47 fld DWORD PTR y fld st(0) // y y x*0.47 fmul st(0), st(1) // y*y y x*0.47 fld _1_47 // 1.47 y*y y x*0.47 fxch st(3) // x*0.47 y*y y 1.47 fmulp st(1), st(0) // x*0.47*y*y y 1.47 fsubp st(2), st(0) // y 1.47-x*0.47*y*y fmulp st(1), st(0) // result fstp y and y, 07FFFFFFFh } r = *(float *)&y; // optional r = (3.0f - x * (r * r)) * r * 0.5f; // remove for low accuracy return r; } /* sqrt(x) = x / sqrt(x) */ float __fastcall ulsqrt(float x) { return x * ulrsqrt(x); } inline unsigned __int64 GetCycleCount(void) { _asm _emit 0x0F _asm _emit 0x31 } аналог GetTickCount, но гораздо точнее ещё где то было вообще если хорошенько поискать... |
Сообщ.
#26
,
|
|
|
Цитата Асмовые вставки, насколько я знаю в основном используют в графике... Ну... я бы несказал, что в графике... Чаще всего в вирях |
Сообщ.
#27
,
|
|
|
SmK, да экспортировалось!! и все работет могу dll'ку выложить.
И не надо обсерать асем, асем это - "основа". я вот что хочу сказть по поводу асма, если не умеешь на нем писать как нужно, то и будет отстоем:) да листинг сдоровенный. я считаю лючше интегрировать уж стразу C++, тогда больше толку будет. но это мое мнение. Добавлено слушай Sciner, а зачем Цитата цитата из Readme!!!.txt ASM-код всех модулей, классов, контролов и форм проекта |
Сообщ.
#28
,
|
|
|
незнаю
|
Сообщ.
#29
,
|
|
|
Цитата maxim84_ @ 17.11.04, 19:38 SmK, да экспортировалось!! и все работет могу dll'ку выложить. И не надо обсерать асем, асем это - "основа". я вот что хочу сказть по поводу асма, если не умеешь на нем писать как нужно, то и будет отстоем:) да листинг сдоровенный. я считаю лючше интегрировать уж стразу C++, тогда больше толку будет. но это мое мнение. Добавлено слушай Sciner, а зачем Цитата цитата из Readme!!!.txt ASM-код всех модулей, классов, контролов и форм проекта например, чтобы скомпилировать код на асме. Прога тогда msvbvm60.dll е будет требовать, наверное... |
Сообщ.
#30
,
|
|
|
miksayer, не много не понел
Ну да, будет, конечно поскольку вставки в VB проекте!! или ты про что то другое? SCINER, а зачем тогда парился? просто так? ты что то про PB говорил, не почается?мне кажеться просто стоит скомпелировать асемовским компилем и вырезать нужную вставку и вставить там где эта вставка на VB. Другой вопрос как это сделать? можно выризать диапазон адресов. я тык пытался, видно не фига в адрес не попал. нужно работать по принцепу вирей. где они свой код вписывают в нужные адриса. |
Сообщ.
#31
,
|
|
|
Цитата SmK, да экспортировалось!! и все работет могу dll'ку выложить. Выкладывай, и дллку и исходник Цитата И не надо обсерать асем И не думал... Просто знаю много людей, которые хотят программировать на асме только потому, что это круто, хотят научиться писать вирусы, хотят быть кул хацкерами... конечно нихрена они не напишут, но все равно как то раздражает такая самоуверенность. |
Сообщ.
#32
,
|
|
|
не понел. Товарищи модераторы, в чем дело? тема не закрыта.
|
Сообщ.
#33
,
|
|
|
Дело во флейме. Интересно читать результаты, а не разборки по поводу личных отношений к асму. Тема не закрыта. Сообщения не удалены, а пока скрыты.
|
Сообщ.
#34
,
|
|
|
maxim84_, так а сейчас в чём вопрос состоит? вроде и Ты и Sciner прдложили варианты...
|
Сообщ.
#35
,
|
|
|
miksayer взгляни тут
|