Advertisement
Wow_Rasl

Untitled

May 27th, 2022
709
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define _CRT_SECURE_NO_WARNING
  2. #include <stdio.h>
  3. #include <locale.h>
  4. #define SIZE 4          // Количество элементов в массиве A
  5. char A[SIZE];           // Массив A
  6. char B[SIZE];           // Массив B
  7. char* C[SIZE];          // Массив C
  8. char k = 0;             // Счетчик попадающих в заданный диапазон элементов
  9. char sum = 0;           // Сумма элементов попадающих в заданный диапазон
  10.  
  11. void asm_solve() {      // функция с ассемблерной вставкой
  12.     __asm {
  13.         lea esi, A      // Кладем в двойное слово esi адрес первого элемента из А
  14.         lea edi, B      // В edi адрес первого из В
  15.         lea ebx, C      // Аналогично в ebx первого из С
  16.         mov bh, sum     // В bl кладем сумму подходящих элементов
  17.         mov ch, k       // В байтовый регистр ch кладем начальное значение счетчика подходящих элементов
  18.         mov cl, SIZE    // В cl кладем размер массива
  19.  
  20.         BEGIN : mov al, [esi]   // Метка начала: кладем в байтовый регистр al значение текущего элемента элемента A
  21.         mov dl, al              // Кладем в байтовый регистр dl значение al
  22.         add dl, 3               // Добавляем к dl 3 чтобы сравнить ее положение относительно левой границы заданного диапазона
  23.         cmp dl, 0               // сравниваем с 0
  24.         jns RHS                 // если dl подошло по левой границе то переходим в метку RHS
  25.         jmp NXT                 // иначе переходим в метку NXT
  26.         RHS :
  27.         mov dl, al              // Кладем в байтовый регистр dl значение al
  28.             sub dl, 4           // Вычитаем из dl 4 чтобы сравнить ее положение относительно правой границы заданного диапазона
  29.             cmp dl, 0           // сравниваем dl с 0
  30.             je CHANGE           // если dl подошло по правой границе то переходим в метку CHANGE
  31.             js CHANGE           // если dl подошло по правой границе то переходим в метку CHANGE
  32.             jmp NXT             // иначе переходим в метку NXT
  33.  
  34.         CHANGE :                // метка CHANGE
  35.         mov al, [esi]           // кладем в al текущий элемент из A
  36.             mov[edi], al        // кладем al в текущий элемент из B
  37.             //lea eax, [edi]
  38.             //mov[C + ebx*4], eax
  39.             mov[ebx], edi       // кладем в текущий элемент из С смещение
  40.             add bh, [edi]     // добавляем al к счетчику суммы подходящих элементов
  41.             inc edi             // двигаемся дальше по В
  42.             add ebx, 4          // двигаемс дальше по С
  43.             add ch, 1           // увеличиваем счетчик количества подходящих элементов
  44.  
  45.         NXT :                   // метка NXT
  46.         inc esi                 // идем дальше по А
  47.             dec cl              // Вычитаем 1 из счетчика цикла
  48.             cmp cl, 0           // Сравниваем его с 0
  49.             jne BEGIN           // Если он еще не достиг 0, то переходим обратно на метку начала BEGIN
  50.             mov k, ch           // сохраняем кол-во элементов в В
  51.             mov sum, bh         // сохраняем сумму элементов из B
  52.     }
  53. }
  54. int main() {
  55.  
  56.     char x1;
  57.     double p = 0;
  58.     setlocale(LC_ALL, "rus");
  59.  
  60. START:
  61.     printf("Желаете запустить программу? (1 или 0)\n");
  62.     char str[40];
  63.     gets(str);
  64.     if (strlen(str) > 1) { printf("1 или 0\n"); goto START; }
  65.     if (str[0] == '0') { return 0; }
  66.     if (str[0] == '1') { goto INPUT; }
  67.  
  68. INPUT: printf("Ведите массив A из 16 элементов\n");
  69.     printf("Задайте элементы массива A: \n");
  70.  
  71.     for (int i = 0; i < SIZE; i++) {
  72.         scanf_s("%lf", &p);
  73.         if ((p <= 127) && (p >= -128)) { A[i] = p; }
  74.         else { printf("not a char\n"); goto INPUT; }
  75.     }
  76.  
  77.     asm_solve();        // запуск функции с ассемблерной вставкой
  78.  
  79.  
  80.     // вывод ответа
  81.     puts("\nМассив А:");
  82.     for (int i = 0; i < SIZE; i++) {
  83.         printf("%hd ", A[i]);
  84.     }
  85.     puts("\nМассив B:");
  86.     for (int i = 0; i < k; i++) {
  87.         printf("%hd\t%p\n", B[i], B + i);
  88.     }
  89.     puts("\nМассив C:");
  90.     for (int i = 0; i < k; i++) {
  91.         printf("%p\n", C[i]);
  92.     }
  93.     printf("\nКоличество элементов в В: %d\n", k);
  94.     printf("Сумма элементов в В: %d\n", sum);
  95.     goto START;
  96.  
  97.  
  98.  
  99. }
Advertisement
RAW Paste Data Copied
Advertisement