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); }
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)); }
public static void SafeInvokeAsm <T1, T2>(ref T1 firstAsmArg, ref T2 secondAsmArg, SASMCode code) { SafeInvokeAsm(ref firstAsmArg, ref secondAsmArg, (byte[])code); }
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(); }