На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Ассемблеровские вставки
    Можно ли в VB использовать асемблеровские вставки?
      Цитата miksayer @ 15.11.04, 12:47
      Можно ли в VB использовать асемблеровские вставки?

      Вроде не маленький уже. Должен и сам знать... :)
        я нашел вот такое:
        Цитата

        Суть метода заключается в том, чтобы хранить уже скомпилированный код в виде константы. Каким образом это реализуется? Ниже приведена измененная мною выдержка из кода с моими пояснениями.

        Листинг – пример использования хранимых функций
        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, но я не знаю!
          Это нереально! Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc...
            хммм очень даже ничего мысля.
            вот только нужно мозгами раскинуть как это будет выглядеть...:)
            Сообщение отредактировано: Vasya2000 -
              Цитата
              Если только SCINER или кто-либо другой сделает аддин для ВБ, компилирующий ассемблерную вставку и преобразующий ее в константу, с последующим вызовом при помощи CallWindowProc...

              а вообще реально такой адд-ин написать?
                Если поднатужиться и время найти бы, то может и реально.
                У кого нибудь есть простинкая библиотека на асме, буквально 2+2? и чтоб результат верНула?
                Идея посетила меня...

                Добавлено
                перевести написаный код допустим в:
                ExpandedWrap disabled
                  ' #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 по сути дела не проблема.
                Проблема как и куда это дописать.
                Есть варианты такие, делать как выше сказано, хранить уже хекс в константе, либо делать так:
                допустим есть функция
                ExpandedWrap disabled
                   Public Function TestAsm(a as Integr, b as Integer)
                    'и тут писать вставку на асме
                   End Function

                потом вставка компилируется асмом, создается dll'ка и дописывается по этому адресу. Но здесь есть большое НО... Где гарантия что адреса совпадут? Т.е. вызов функции VB и фнкции ASM Dll могут иметь не много разные значения. Или в этой функции (VB) положить константу с хексом функции на асме...
                Но не знаю тут просто нужно подумать как следует.:yes:

                Добавлено
                Хммм ребят а обязательно ее вшивать? может рядом положить?
                Сообщение отредактировано: Vasya2000 -
                  :))) Мне удалось интегрировать функции написаные на Visual C++, откомпилировать, и записать блиотеку. Пока она лежит рядом.
                  Вот что касается асма, то мое маленькое достижение поможет писать на асме в среде Visual Basic т.к. всем известно что в С++ встроен асм.:))
                  Ввыглядит это примерно вот так:
                  в модуле пишем:
                  ExpandedWrap disabled
                    '#_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

                  Прописываем библиотеку тоже в каком-нибудь модуле:
                  ExpandedWrap disabled
                     
                      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],
                    'таким образом можно создавать не сколько библеотек в одном модуле...

                  и в кнопку пишем вот такую гадость
                  ExpandedWrap disabled
                    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 проекта, т.е. при нажатии на собственную кнопку начинается компиляция и запуск проекта.
                  Не оставьте без совета...
                  Сообщение отредактировано: Vasya2000 -
                    maxim84_, ну это не асм вставки - это исп. длл с асмом :)
                      Компилировать модули с ASM функциями PowerBasic компилятором.
                      PS Это только мысль, ничем не подтвержденная и не проверенная.
                        SCINER, а я уж хотел спросить... Работает ли? :)
                          Простите за мою темнату в зании PB, а он умеет компелировать асем?

                          Цитата

                          maxim84_, ну это не асм вставки - это исп. длл с асмом


                          А пример приведеный выше разве не является примером использования dll с асмом?

                          я просто не смог вырезать вункцию из скомпелированной dll'ки и вставить ее в .exe!
                          Сообщение отредактировано: maxim84_ -
                            maxim84_, Ладно, старался на + :)
                              Приколитесь, даже в батнике реально забацать библиотеку.

                              Юзать так:

                              ExpandedWrap disabled
                                Private Declare Sub Function1 Lib "dll.dll" ()
                                 
                                Private Sub Command1_Click()
                                Function1
                                End Sub

                              Прикреплённый файлПрикреплённый файлbat.dll.zip (2.17 Кбайт, скачиваний: 107)
                                SCINER, :blink: :blink: Я чето непонял... там асм в bat файле???
                                  Цитата
                                  SCINER, Я чето непонял... там асм в bat файле???

                                  ну, и я тож ни че не понял
                                    Цитата
                                    А пример приведеный выше разве не является примером использования dll с асмом?

                                    я просто не смог вырезать вункцию из скомпелированной dll'ки и вставить ее в .exe!


                                    Я вообще-то и не понял даже где там асм... :no:
                                    ExpandedWrap disabled
                                      #_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

                                    Ето что-ли?
                                    Функция выглядела бы:
                                    ExpandedWrap disabled
                                      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


                                    :D Понапридумывают...
                                    Сообщение отредактировано: Black Star -
                                      але! ты читать у меешь??
                                      Цитата

                                      Вот что касается асма, то мое маленькое достижение поможет писать на асме в среде Visual Basic т.к. всем известно что в С++ встроен асм.)


                                      Где там SCINER? Ты хотел компилить только асемовские вставки?асем то компилить мона - это без вопросов, вот только как это пристрастить к VB? смутно представляю
                                      раскажи по подробней о своей идеии
                                      Сообщение отредактировано: maxim84_ -
                                        Цитата
                                        раскажи по подробней о своей идеии

                                        у него может и идей нету
                                          Цитата Andrey_Kun @ 16.11.04, 15:24
                                          SCINER, :blink: :blink: Я чето непонял... там асм в bat файле???

                                          Это ниже чем асм.
                                          Это самое низкоуровневое программирование.
                                          Ниже некуда.
                                          Это машинные коды!

                                          Добавлено
                                          Цитата miksayer @ 16.11.04, 18:36
                                          Цитата
                                          раскажи по подробней о своей идеии

                                          у него может и идей нету

                                          Идея есть.

                                          1. Линкер. Ему указывают из каких файлов собрать экзешку. Это можно увидеть, если перехватить его командную строку. Она выглядит примерно так:

                                          ExpandedWrap disabled
                                            \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 файлы.
                                          Сообщение отредактировано: SCINER -
                                            я тут начал разбор полетов с компилятором c2.exe
                                            вот, что пока из этого выходит:

                                            Сперва ОБЯЗАТЕЛЬНО прочтите Readme!
                                            Прикреплённый файлПрикреплённый файлvb2asm.zip (1.51 Кбайт, скачиваний: 163)
                                              Цитата
                                              BYTE _stdcall TestByte( BYTE a, LPBYTE b )

                                              maxim84_, у тебя эта ф-я экспортировалась ?? не верю...
                                              вот так должно экспортироваться
                                              ExpandedWrap disabled
                                                extern "C" __dllspec(dllexport) __stdcall TestByte( BYTE a, LPBYTE b )

                                              И действительно, если кому то нужны вставки на асме пусть пишет длл на С, не очень удобно конечно, не не менее,
                                              чем писать вставки на асме...

                                              А вообще, чего вам сдался этот асм, это ж отстой, только для понта разве что... реального применения практически нет... рельно полезных асм вставок единицы, и все они уже написанны до нас...
                                                Цитата
                                                рельно полезных асм вставок единицы, и все они уже написанны до нас...


                                                Вот если бы они ещё волялись всюду :)
                                                  Цитата
                                                  А вообще, чего вам сдался этот асм, это ж отстой, только для понта разве что... реального применения практически нет... рельно полезных асм вставок единицы, и все они уже написанны до нас...

                                                  а, например, узнать тактовую частоту процессора и вообще можно много чего узнать
                                                    Цитата
                                                    а, например, узнать тактовую частоту процессора и вообще можно много чего узнать

                                                    Ага, много всего, только это по большому счёту бесполезная информация...

                                                    Асмовые вставки, насколько я знаю в основном используют в графике...
                                                    Цитата
                                                    Вот если бы они ещё волялись всюду

                                                    ExpandedWrap disabled
                                                      __inline void MyFtoL(int *i, float f )
                                                      {
                                                        __asm fld f;
                                                        __asm mov edx, I
                                                        __asm fistp [edx];
                                                      }


                                                    ExpandedWrap disabled
                                                      /*********************************************************************
                                                      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);
                                                      }


                                                    ExpandedWrap disabled
                                                          inline unsigned __int64 GetCycleCount(void)
                                                          {
                                                              _asm _emit 0x0F
                                                              _asm _emit 0x31
                                                          }

                                                    аналог GetTickCount, но гораздо точнее
                                                    ещё где то было :) вообще если хорошенько поискать...
                                                      Цитата
                                                      Асмовые вставки, насколько я знаю в основном используют в графике...


                                                      Ну... я бы несказал, что в графике... Чаще всего в вирях :ph34r:
                                                        SmK, да экспортировалось!! и все работет могу dll'ку выложить.
                                                        И не надо обсерать асем, асем это - "основа". я вот что хочу сказть по поводу асма, если не умеешь на нем писать как нужно, то и будет отстоем:) да листинг сдоровенный.

                                                        я считаю лючше интегрировать уж стразу C++, тогда больше толку будет. но это мое мнение.:)

                                                        Добавлено
                                                        слушай Sciner, а зачем
                                                        Цитата

                                                        цитата из Readme!!!.txt
                                                        ASM-код всех модулей, классов, контролов и форм проекта
                                                        Сообщение отредактировано: maxim84_ -
                                                          незнаю :huh:
                                                            Цитата maxim84_ @ 17.11.04, 19:38
                                                            SmK, да экспортировалось!! и все работет могу dll'ку выложить.
                                                            И не надо обсерать асем, асем это - "основа". я вот что хочу сказть по поводу асма, если не умеешь на нем писать как нужно, то и будет отстоем:) да листинг сдоровенный.

                                                            я считаю лючше интегрировать уж стразу C++, тогда больше толку будет. но это мое мнение.:)

                                                            Добавлено
                                                            слушай Sciner, а зачем
                                                            Цитата

                                                            цитата из Readme!!!.txt
                                                            ASM-код всех модулей, классов, контролов и форм проекта

                                                            например, чтобы скомпилировать код на асме. Прога тогда msvbvm60.dll е будет требовать, наверное...
                                                              miksayer, не много не понел
                                                              Ну да, будет, конечно поскольку вставки в VB проекте!! или ты про что то другое?

                                                              SCINER, а зачем тогда парился? просто так? ты что то про PB говорил, не почается?мне кажеться просто стоит скомпелировать асемовским компилем и вырезать нужную вставку и вставить там где эта вставка на VB. Другой вопрос как это сделать? можно выризать диапазон адресов. я тык пытался, видно не фига в адрес не попал. нужно работать по принцепу вирей. где они свой код вписывают в нужные адриса.
                                                              Сообщение отредактировано: maxim84_ -
                                                                Цитата
                                                                SmK, да экспортировалось!! и все работет могу dll'ку выложить.

                                                                Выкладывай, и дллку и исходник :)

                                                                Цитата
                                                                И не надо обсерать асем

                                                                И не думал... Просто знаю много людей, которые хотят программировать на асме только потому, что это круто, хотят научиться писать вирусы, хотят быть кул хацкерами... конечно нихрена они не напишут, но все равно как то раздражает такая самоуверенность.
                                                                  не понел. Товарищи модераторы, в чем дело? тема не закрыта.
                                                                  Сообщение отредактировано: maxim84_ -
                                                                    Дело во флейме. Интересно читать результаты, а не разборки по поводу личных отношений к асму. Тема не закрыта. Сообщения не удалены, а пока скрыты.
                                                                      maxim84_, так а сейчас в чём вопрос состоит? вроде и Ты и Sciner прдложили варианты...
                                                                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                        0 пользователей:


                                                                        Рейтинг@Mail.ru
                                                                        [ Script execution time: 0,0788 ]   [ 15 queries used ]   [ Generated: 17.05.24, 08:49 GMT ]