Beispiel #1
0
        static void Main(string[] args)
        {
            unsafe
            {
                InvokeAsm((void *)0, (void *)0, new SASMCode(
                              @"
                    STD_OUTPUT_HANDLE equ -0Bh

                    extern GetStdHandle lib kernel32.dll
                    extern WriteConsoleW lib kernel32.dll
                
                    invoke GetStdHandle STD_OUTPUT_HANDLE
                    mov edx, addr V_OutHndl
                    mov [edx], eax
                    invoke WriteConsoleW eax, addr V_HelloMsg, 0Eh, addr V_WriteCount, 0
                    asmret

                    V_HelloMsg dw 'Hello World!', 0Dh, 0Ah, 0
                    V_OutHndl dd 0
                    V_WriteCount dd 0
                    ").Code);
            }
            Console.WriteLine();


            Console.WriteLine($"Исходная строка: {_str}");
            int      l_len = _str.Length;
            SASMCode c1    = new SASMCode(_stringCopy);

            SafeInvokeAsm(ref _str, ref l_len, c1.Code);
            Console.WriteLine($"Строка в переменной V_String SASM-кода: {c1.GetWStringVariable("V_String")}");
            Console.WriteLine();

            Console.WriteLine($"Исходная строка: {_str}");
            SASMCode c2   = new SASMCode(_stringReturn);
            string   copy = SafeInvokeAsm <string, int, string>(ref _str, ref l_len, (byte[])c2);

            Console.WriteLine($"Строка, указатель на которую вернул ассемблерный код: {copy}");
            Console.WriteLine();

            Random rnd = new Random();

            Console.WriteLine($"Передаём объект типа {rnd.GetType()} с хеш-кодом {rnd.GetHashCode()}.");
            Random retRnd = SafeInvokeAsm <Random, Random, Random>(ref rnd, ref rnd, new SASMCode(_getAndReturnObject));

            Console.WriteLine($"Получили объект типа {retRnd.GetType()} с хеш-кодом {retRnd.GetHashCode()}.");
            Console.WriteLine("Проверка функциональности - 10 случайных целых из интервала [0; 5).");
            for (int i = 0; i < 10; i++)
            {
                Console.Write(retRnd.Next(0, 5) + " ");
            }
            Console.WriteLine();
            Console.WriteLine();

            DateTime n    = DateTime.Now;
            SASMCode full = new SASMCode(_fullVonNeumann);

            Console.WriteLine($"Время трансляции: {DateTime.Now - n}.");
            unsafe
            {
                int selected = (int)InvokeAsm((void *)0, (void *)0, (byte[])full);
                Console.WriteLine($"Вы выбрали число {selected} (0x{Convert.ToString(selected, 16)}).");
            }
            Console.WriteLine();

            Console.Write("Введите размер массива для сортировки: ");
            int arraySize = Convert.ToInt32(Console.ReadLine());

            _arr  = new int[arraySize];
            _arr1 = new int[arraySize];
            _arr2 = new int[arraySize];
            Random rand = new Random();

            for (int i = 0; i < arraySize; i++)
            {
                _arr[i] = rand.Next();
            }
            Array.Copy(_arr, _arr1, arraySize);
            Array.Copy(_arr, _arr2, arraySize);
            DateTime start1 = DateTime.Now;
            SASMCode sort   = new SASMCode(_asmInsertionSort);
            DateTime start2 = DateTime.Now;

            unsafe
            {
                fixed(int *arrPtr = _arr1)
                {
                    InvokeAsm(arrPtr, &arraySize, (byte[])sort);
                }
            }
            DateTime finish = DateTime.Now;

            Console.WriteLine($"Сортировка вставками на ассемблере заняла (в т.ч. время трансляции): {finish - start1} ({start2 - start1}).");
            start1 = DateTime.Now;
            for (int i = 1; i < _arr2.Length; i++)
            {
                int tmp = _arr2[i];
                int j   = i - 1;
                for (; j >= 0; j--)
                {
                    if (_arr2[j] > tmp)
                    {
                        _arr2[j + 1] = _arr2[j];
                    }
                    else
                    {
                        break;
                    }
                }
                _arr2[j + 1] = tmp;
            }
            finish = DateTime.Now;
            Console.WriteLine($"Сортировка вставками на C# заняла: {finish - start1}.");
            Array.Sort(_arr);
            bool equal = true;

            for (int i = 0; i < arraySize; i++)
            {
                if (_arr[i] != _arr1[i] || _arr[i] != _arr2[i])
                {
                    Console.WriteLine($"Разные значения на позиции {i} (ожидаемое - ассемблер - C#): {_arr[i]} - {_arr1[i]} - {_arr2[i]}...");
                    equal = false;
                    break;
                }
            }
            if (equal)
            {
                Console.WriteLine("Массивы отсортированы корректно!");
            }
            Console.ReadKey(true);
        }
Beispiel #2
0
 public static Tret SafeInvokeAsm <T1, T2, Tret>(ref T1 firstAsmArg, ref T2 secondAsmArg, SASMCode code)
 {
     return(SafeInvokeAsm <T1, T2, Tret>(ref firstAsmArg, ref secondAsmArg, (byte[])code));
 }
Beispiel #3
0
 public static void SafeInvokeAsm <T1, T2>(ref T1 firstAsmArg, ref T2 secondAsmArg, SASMCode code)
 {
     SafeInvokeAsm(ref firstAsmArg, ref secondAsmArg, (byte[])code);
 }
Beispiel #4
0
 private static void _saveByteCode(SASMCode _c)
 {
     System.IO.BinaryWriter writer = new System.IO.BinaryWriter(new System.IO.FileStream("bcode.bin", System.IO.FileMode.Create));
     writer.Write(_c.Code);
     writer.Close();
 }