Advertisement
Wow_Rasl

Untitled

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