Advertisement
VladimirKostovsky

assembler_find_max

Sep 24th, 2024
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <limits>
  3.  
  4. using namespace std;
  5.  
  6. int FindMax(int a[], int n, int *i = nullptr) {
  7.     if (n == 0) {
  8.         if (i != nullptr) {
  9.             *i = -1;
  10.         }
  11.         return 0x80000000; // Возвращаем -2147483648
  12.     }
  13.  
  14.     int maxVal = a[0];
  15.     int index = 0;
  16.  
  17.     __asm {
  18.         mov edi, a        // Адрес массива в регистре edi
  19.         mov ecx, n        // Длина массива в ecx
  20.         xor edx, edx      // Счетчик индексов в edx
  21.         mov eax, [edi]    // Загружаем первый элемент массива в eax (максимум)
  22.  
  23.     find_loop:
  24.         cmp edx, ecx      // Сравниваем индекс с длиной массива
  25.         jge done           // Если индекс >= длины массива, выходим
  26.  
  27.         mov ebx, [edi + edx * 4] // Загружаем элемент массива в ebx
  28.         cmp ebx, eax      // Сравниваем его с текущим максимумом
  29.         jle skip          // Если не больше, пропускаем
  30.  
  31.         mov eax, ebx      // Обновляем максимум
  32.         mov index, edx    // Обновляем индекс
  33.  
  34.     skip:
  35.         inc edx           // Переходим к следующему индексу
  36.         jmp find_loop     // Повторяем цикл
  37.  
  38.     done:
  39.         // Возвращаем результат
  40.         mov maxVal, eax   // Сохраняем максимум
  41.     }
  42.  
  43.     if (i != nullptr) {
  44.         *i = index;        // Записываем индекс, если указатель не равен нулю
  45.     }
  46.  
  47.     return maxVal;        // Возвращаем максимальное значение
  48. }
  49.  
  50. void PrintArray(const int arr[], int size) {
  51.     for (int j = 0; j < size; ++j) {
  52.         cout << arr[j] << " ";
  53.     }
  54.     cout << endl;
  55. }
  56.  
  57. int main() {
  58.     // Тестовые примеры
  59.  
  60.     // Пример 1: Пустой массив
  61.     int arr1[] = {};
  62.     int index1;
  63.     int max1 = FindMax(arr1, 0, &index1);
  64.     cout << "Исходный массив: ";
  65.     PrintArray(arr1, 0);
  66.     cout << "Максимум: " << max1 << ", Индекс: " << index1 << endl;
  67.  
  68.     // Пример 2: Массив с несколькими элементами, i не задан
  69.     int arr2[] = {3, 5, 2, 5, 1};
  70.     int max2 = FindMax(arr2, 5);
  71.     cout << "Исходный массив: ";
  72.     PrintArray(arr2, 5);
  73.     cout << "Максимум: " << max2 << endl;
  74.  
  75.     // Пример 3: Массив с несколькими элементами, максимальное значение встречается несколько раз
  76.     int arr3[] = {7, 3, 7, 1, 4};
  77.     int index3;
  78.     int max3 = FindMax(arr3, 5, &index3);
  79.     cout << "Исходный массив: ";
  80.     PrintArray(arr3, 5);
  81.     cout << "Максимум: " << max3 << ", Индекс: " << index3 << endl;
  82.  
  83.     // Пример 4: Массив с одним элементом
  84.     int arr4[] = {42};
  85.     int index4;
  86.     int max4 = FindMax(arr4, 1, &index4);
  87.     cout << "Исходный массив: ";
  88.     PrintArray(arr4, 1);
  89.     cout << "Максимум: " << max4 << ", Индекс: " << index4 << endl;
  90.  
  91.     return 0;
  92. }
  93.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement