النتائج 1 إلى 4 من 4
الموضوع:

VB6] - Inline assembler Add-in.

الزوار من محركات البحث: 23 المشاهدات : 679 الردود: 3
جميع روابطنا، مشاركاتنا، صورنا متاحة للزوار دون الحاجة إلى التسجيل ، الابلاغ عن انتهاك - Report a violation
  1. #1
    من أهل الدار
    قَـمِےر ٱلعَراق
    تاريخ التسجيل: August-2014
    الدولة: °•°في قلب اغلى الكون°•°
    الجنس: أنثى
    المشاركات: 29,791 المواضيع: 370
    التقييم: 16984
    مزاجي: من يقترب عليه تحمل جنون دلعي
    المهنة: مبرمجه
    أكلتي المفضلة: سوشي و فنكر
    موبايلي: honor
    مقالات المدونة: 19

    VB6] - Inline assembler Add-in.

    مضمنة الوظيفة الإضافية.
    تحية للجميع!
    هناك حالات حيث تحتاج إلى استخدام رمز التجميع في مشاريع VB6 الخاص بك. وعادة ما يتم ذلك باستخدام التعليمات البرمجية التي تم تجميعها سابقا التي يتم وضعها في الذاكرة. ثم يتم تشغيل هذا الرمز باستخدام طريقة الملايين. للأسف هذه الطريقة لديها عيوب. على سبيل المثال، سيكون لديك لتغيير إجراءات رمز الموضع في الذاكرة إذا قمت بتغيير رمز أسم. وبالإضافة إلى ذلك هو عملية بطيئة جدا. لقد كتبت الوظيفة الإضافية التي لا هذه العملية تلقائيا، أيضا بعد تجميع أي عمليات من وضع التعليمات البرمجية في الذاكرة لا يتم تنفيذها. وصلات رمز أسم إلى إيكس. هذه الوظيفة الإضافية تدعم رمز أسم إما إيد أو النموذج المترجم (الأصلي فقط!).

    كيف تستعمل؟
    أولا لديك لتثبيت الوظيفة الإضافية (المثبت المتاحة في نهاية المقال). بعد تثبيت يجب تشغيل الوظيفة الإضافية من VB6 إيد (الوظائف الإضافية -> إضافة في مدير -> مضمنة المجمع). ويضيف العنصر الجديد إلى القائمة الوظائف الإضافية. إذا كان المشروع الحالي لا يستخدم ميزات الإضافية في بعد أنها سوف تضيف وحدة جديدة للمشروع. يجب إضافة نماذج من الوظائف في هذه الوحدة النمطية من أجل استدعائها من رمز VB6. يمكنك إعادة تسمية هذه الوحدة النمطية، ووضع النماذج من الوظائف، ولكن لا يمكنك وضع التعليمات البرمجية لهذه الوحدة النمطية. بعد إنشاء وحدة نمطية يمكنك تشغيل أسم محرر. هناك كومبوكس مع الوظائف التي قمت بتعريفها في الوحدة النمطية. لكل وظيفة يمكنك تجاوز التعليمات البرمجية باستخدام
    ناسمبناء الجملة. ولكن إذا لم تقم بتجاوز التعليمات البرمجية (مجرد تركها فارغة) لن يتم تجاوز الدالة (ترك هذه الوظيفة وظيفة vb6 نموذجية). ويرتبط كل مشروع (إذا كنت تستخدم هذه الوظيفة الإضافية) الملف الإضافي مع * .ia في مجلد المشروع. يحتوي هذا الملف على رموز أسم لكل وظيفة يتم تجاوزها بواسطة المستخدم. هذه الوظيفة الإضافية "بشفافية"، أي إذا قمت بتعطيل وظيفة إضافية سوف تعمل وتجميع، فقط "كعب وظائف" ستعمل دون تجاوزات. * ملف .ia ليس "ضروري للغاية" للعمل من المشروع، أي هذا المشروع سوف تعمل على أي حال.
    دعونا ننظر في العمل من الوظيفة الإضافية مع المثال البسيط. على سبيل المثال، نحن بحاجة إلى مزج اثنين من الأعداد الصحيحة صفائف دون تفيض، أي إذا كانت نتيجة إضافة أكبر من 32767 ينبغي أن تترك إلى 32767. مقابل، إذا كانت نتيجة إضافة أصغر من -32768 ينبغي أن تبقى إلى -32768. لهذا تناسب بشكل جيد جدا مكس تمديد. لديها تعليمات للعمل مع البيانات ناقلات مع التشبع. حسنا لنذهب! إنشاء مشروع جديد، فتح الوظيفة الإضافية. ويضيف وحدة جديدة، إعادة تسمية هذه الوحدة النمطية ل مودينلينسم. الآن تعريف النموذج الأولي من وظيفة:
    الشفرة:
    الوظيفة العامة مكساد (_ بيريف ديست أس إنتيجر، _ بيريف سرك أس إنتيجر، _ بيفال العد كما طويل) كما طويلة إند فونكتيون
    في المعلمة الأولى نحن تمرير العنصر الأول من مجموعة، أيضا هذه الصفيف هو نتيجة؛ في المعلمة الثانية نحن تمرير العنصر الأول من الصفيف الثاني. وأخيرا، في المعلمة الثالثة نحن تمرير عدد من العناصر. لاحظ أن حجم يجب أن تكون متعددة من 8 بايت، لأننا سوف نستخدم تعليمات المتجهات، والتي تعمل مع 8 بايت في وقت واحد. الآن تحديد الإجراء الذي سوف استدعاء هذه الوظيفة:
    الشفرة:
    بريفات سوب Form_Load () ديم سرك () أس إنتيجر ديم دست () أس إنتيجر حجم خافت كما طويلة مؤشر الخافت طويل سيز = 1024 ريديم سرك (الحجم - 1) ريديم دست (الحجم - 1) بالنسبة إلى الفهرس = 0 إلى الحجم - 1 '// ملء صفائف مع جيب سرك (إندكس) = سين (إندكس / 40) * 20000 دست (إندكس) = سين (إندكس / 23) * 20000 التالى '// إضافة مع التشبع مكساد دست (0)، سرك (0)، سيز '// رسم النتيجة أوتوريدراو = ترو سكيل (0، 32767) - (إندكس، -32768) بالنسبة إلى الفهرس = 0 إلى الحجم - 1 إذا فهرس ثم Me.Line - (إندكس، دست (إندكس)) آخر Me.PSet (إندكس، دست (إندكس)) إنهاء إذا التالى إند سوب
    كما ترون هنا كل صفائف مليئة الجيب التي لها فترة مختلفة. وعلاوة على ذلك نحن مزيج هذه المصفوفات باستخدام وظيفة مكساد . في نهاية المطاف يتم عرض مجموعة النتائج إلى الشاشة. الآن يجب علينا تجاوز وظيفة مكساد . لهذا تفعيل الوظيفة الإضافية. سيتم فتح نافذة محرر، وهناك نختار الدالة مكساد وإضافة التعليمات البرمجية التالية:
    الشفرة:
    بيتس 32 . إضافة صفيفتين باستخدام التشبع . يجب أن يكون حجم المصفوفات متعددة من 8 دفع إب موف إب، إسب دفع إبكس دفع إيسي دفع إدي موف إيسي، دورد [إب + 0x8] موف إدي، دورد [إب + 0x0C] موف إسكس، دورد [إب + 0x10] شر إيسكس، 2 اختبار إيسكس، إسكس جي EXIT_PROC إمس؛ تهيئة مكس دورة: موفق MM0، كوورد [إدي] موفق MM1، كوورد [إيسي] بادسو MM1، MM0 موفق كوورد [إيسي]، MM1 إضافة إيسي، 0x8 إضافة إدي، 0x8 حلقة حلقة ايمس EXIT_PROC: بوب إدي البوب ​​إيسي بوب إبكس موف إسب، إب بوب إب ريت 0x0c
    انها بسيطة جدا إذا كنت تعرف مجموعة التعليمات. والتعليم الرئيسي هو بادسو أن يضيف اثنين رباعية الأبعاد 16 بت ناقلات عدد صحيح مع علامة من قبل عملية واحدة. الآن حفظ المشروع وتشغيله:

    نيس! كما ترون في لقطة، يتم إضافة اثنين من الجيوب مع التشبع. يمكنك ملاحظة التشبع من قمم.
    حسنا، الآن دعونا نحاول تجميع ملف إيكس وتحقق ما يسمى وما يتم ترجمته:

    كما ترون، رمز هو بالفعل داخل إيكس، دون تخصيص الذاكرة والأشياء غير الضرورية.

    كيف يعمل؟
    في الواقع كل شيء بسيط جدا. عند توصيل الوظيفة الإضافية يتم تعيين معالجات الأحداث الرئيسية: الحدث بدء التجميع، تشغيل الحدث التعليمات البرمجية، إغلاق / حفظ الحدث المشروع الخ عند تشغيل التعليمات البرمجية في إيد يتم تجميع جميع رموز أسم، وأيضا عناوين يتم حساب وظيفة تجاوز. وعلاوة على ذلك يتم استبدال رمز وظائف كعب الأصلي إلى أسم رمز. عند استدعاء كعب وظيفة فإنه يدعو رمز أسم. عند إيقاف تنفيذ الوظيفة الإضافية يستعيد التعليمات البرمجية الأصلية. عند ترجمة إلى التعليمات البرمجية الأصلية (أو بالأحرى قبل ربط) يجد ملف أوبج من وحدة قابلة للتغيير ويستبدل التعليمات البرمجية وظائف كعب إلى أسم رمز و ريسافس الملف. لهذه الوظيفة أكتب محلل كوف. عموما يمكن أن توفر الكثير من الميزات المختلفة.
    هذا المشروع هو سيئة جدا اختبار، لأنني لم يكن لديك ما يكفي من الوقت، لذلك أعتقد أنه سوف يحتوي على الكثير من الأخطاء. وبالنظر إلى أن نصف المشروع يستخدم الميزات غير الموثقة والخدعة، والتي ربما لا تعمل كما أعرف. في هذا المشروع حتى لا تسليط الضوء على بناء الجملة، لأنني لم يكن لديك إمكانية لإنهاء مربع النص هيغليغتر بعد. لا يزال أنا باستخدام مربع نص بسيط. إذا كان شخص ما قد وجدت البق الكتابة هنا.
    شكرا للاهتمام!


    Hello everyone!
    There are cases where you need to use the assembly code in your VB6 projects. Usually this is done using a previously-compiled code that is placed into the the memory. Then this code is run using one of millions method. Unfortunately this method has the disadvantages. For instance, you will have to change the procedures of the placement code in the memory If you change the asm-code. In addition it is quite slow process. I've written the Add-in that does these process automatically, also after compilation any processes of the placement of the code in the memory are not performed. Asm-code links to EXE. This add-in supports the asm-code either IDE or the compiled form (native only!).

    How to use?
    First you have to install the Add-in (installer available at the end of article). After installing you should run the Add-in from VB6 IDE (Add-Ins -> Add-in Manager -> Inline assembler). It adds the new item to Add-Ins menu. If current project does not use the add-In features yet it will add the new module to project. You should add the prototypes of the functions in this module in order to call them from VB6 code. You can rename this module, place the prototypes of the functions, but you can't place the code to this module. After creating of the module you can run the ASM-editor. There is the combobox with the the functions which you defined in the module. For each function you can override the code using the
    NASM syntax. However if you don't override code (just leaving it empty) a function won't be overridden (this function is left a typical vb6 function). Each project (if you use this Add-in) is associated the additional file with *.ia extension in the project folder. This file contains the asm-codes for each function that is overridden by user. This add-in works "transparently", i.e. if you disable add-in project will work and compile, only "stub-functions" will work without overrides. *.ia file isn't "vitally essential" for working of the project, i.e. this project will work anyway.
    Let's consider working of Add-in with the simple example. For instance, we need to mix the two integers-arrays without overflowing, i.e. if the result of the addition is greater than 32767 it should be left to 32767. Opposite, if the result of the addition is smaller than -32768 it should be left to -32768. For this very well suit MMX-extension. It has the instructions for working with the vector data with the saturation. Ok, let's go! Create new project, open Add-in. It adds the new module, rename this module to modInlineAsm. Now define the prototype of the function:
    Code:
    Public Function MMXAdd( _ ByRef dest As Integer, _ ByRef src As Integer, _ ByVal count As Long) As Long End Function
    At the first parameter we pass the first element of the array, also this array is result; at the second parameter we pass the first element of the second array; finally, at the third parameter we pass the number of the elements. Note that the size should be a multiple of 8 bytes, because we will use the vector instructions, which work with 8 bytes simultaneously. Now define the procedure that will call this function:
    Code:
    Private Sub Form_Load() Dim src() As Integer Dim dst() As Integer Dim size As Long Dim index As Long size = 1024 ReDim src(size - 1) ReDim dst(size - 1) For index = 0 To size - 1 ' // Fill arrays with sine src(index) = Sin(index / 40) * 20000 dst(index) = Sin(index / 23) * 20000 Next ' // Add with saturation MMXAdd dst(0), src(0), size '// Draw result AutoRedraw = True Scale (0, 32767)-(index, -32768) For index = 0 To size - 1 If index Then Me.Line -(index, dst(index)) Else Me.PSet (index, dst(index)) End If Next End Sub
    As you can see here both arrays are filled with sines which have the different period. Further we mix these arrays using MMXAddfunction. Eventually the result array is being shown to the screen. Now we should override the MMXAdd function. For this activate the Add-in. The editor window will be opened, and there we select the MMXAdd function and add the following code:
    Code:
    BITS 32 ; Addition of two arrays using saturation ; Size of arrays should be a multiple of 8 push EBP mov EBP, ESP push EBX push ESI push EDI mov ESI,DWORD [EBP+0x8] mov EDI,DWORD [EBP+0x0C] mov ECX,DWORD [EBP+0x10] shr ECX,2 test ECX,ECX je EXIT_PROC emms ; Initialize MMX CYCLE: movq MM0,QWORD [EDI] movq MM1,QWORD [ESI] paddsw MM1,MM0 movq QWORD [ESI],MM1 add ESI,0x8 add EDI,0x8 loop CYCLE emms EXIT_PROC: pop EDI pop ESI pop EBX mov esp, ebp pop ebp ret 0x0c
    It's very simple if you know the instruction set. The main instruction is paddsw that adds two four-dimensional 16 bits integer vectors with sign by single operation. Now save project and run it:

    Nice! As you can see at the screenshot, the two sines are added with the saturation. You can notice the saturation by the peaks.
    Okay, now let's try to compile the EXE file and check what is called and what is compiled:

    As you can see, the code is already inside EXE, without memory allocation and unnecessary stuff.

    How does it work?
    Actually everything is very simple. When Add-in is connected the handlers of key events are set: the compilation start event, running code event, close/save project event etc. When you run code in IDE the all asm-codes are being compiled, also the addresses of the overrides function are calculated. Further the code of the original stub-functions is replaced to asm-code. When you call the stub-function it calls the asm-code. When you stop the execution the Add-in restores the original code. When you compile to the native code (or rather before linking) it finds the OBJ-file of the overridable module and replaces the code of the stub functions to asm-code and resaves file. For this functionality i write the COFF parser. Generally it can provides the lot of different features.
    This project is very poorly tested, because i don't have enough time, therefore i think it'll contain very many bugs. Considering that the half of the project uses the undocumented features and trick, which perhaps don't work as i know. In this project even isn't syntax highlighting, because i don't have the possibility to finish the my highlighter textbox yet. Still i'm using the simple textbox. If someone have found the bugs write here.
    Thanks for attention!

  2. #2
    عضو محظور
    بنت لبنان
    تاريخ التسجيل: September-2017
    الدولة: لبنان
    الجنس: أنثى
    المشاركات: 1,195 المواضيع: 11
    صوتيات: 2 سوالف عراقية: 0
    التقييم: 723
    مزاجي: منيح
    أكلتي المفضلة: اندومي
    آخر نشاط: 15/April/2018
    مقالات المدونة: 2
    مجهود رائع
    شكرا االبي ع جهودك

  3. #3
    ١٤٣٩ هَـ .
    تاريخ التسجيل: August-2017
    الجنس: أنثى
    المشاركات: 2,245 المواضيع: 60
    صوتيات: 3 سوالف عراقية: 0
    التقييم: 2922
    شكرا للمجهورد

  4. #4
    من أهل الدار
    قَـمِےر ٱلعَراق

تم تطوير موقع درر العراق بواسطة Samer

قوانين المنتديات العامة

Google+

متصفح Chrome هو الأفضل لتصفح الانترنت في الجوال