Advertisement
Wow_Rasl

Untitled

May 25th, 2022
900
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <locale.h>
  4. #include <math.h>
  5.  
  6. #define SIZE_ARRAY 11   //константа для размра массива
  7.  
  8. int main() {
  9.     char A[SIZE_ARRAY] = { 1, 2, 43, 41, 2, 3, 6, 106, -100, 1, 28 };   //Инициализируем массив А
  10.     char B[SIZE_ARRAY];                 //Обьявляем массив В
  11.     char* C[SIZE_ARRAY];                //Обьявляем массив С
  12.     char f = SIZE_ARRAY - 1, k = 0, sum = 0;    // f - для определения количества оставшихся шагов в "цикле". k - счетчик элементов подходящих под условие
  13.  
  14.         __asm {
  15.         lea esi, A              //Кладем в двойное слово ESI адрес первого элемента массива А
  16.         lea edi, B              //В также в двойное слово EDI кладем адрес первого элемента В
  17.         lea ebx, C              //В EBX адрес первого из С
  18.         mov dl, f               //Кладем в байтовые регистры дополнительные переменные, в DL - счетчик "цикла", отмеряем сколько элементов осталось до конца массива
  19.         mov bl, k               //Для определения количества найденных по правилу задания элементов
  20.         mov cl, sum             //Для определния суммы найденных по правилу задания элементов
  21.  
  22.  
  23.         START :
  24.         mov al, [esi]
  25.             cmp al, -3  // Сравниваем текущее значение и -3
  26.             jae RHS       // Если значение больше или равно -3 то переходим в метку RHS
  27.             jmp NXT       // Иначе переходим в метку N
  28.  
  29.  
  30.         RHS:             // Метка R
  31.         cmp al, 4        // Сравниваем текущее значение и 4
  32.             jbe CUR         // Если значение меньше или равно 4 то
  33.             jmp NXT
  34.  
  35.         CUR:
  36.         inc bl          //прибавляем к счетчику кол-ва элементов 1
  37.             add cl, al
  38.             mov[edi], al
  39.             inc edi
  40.             //mov[ebx], esi
  41.             lea eax, [ebx]
  42.             mov [C + ebx], eax
  43.             inc ebx
  44.             inc bl
  45.             jmp NXT
  46.  
  47.         NXT:             // Метка NXT
  48.         inc esi
  49.             dec dl       //Уменьшаем количество оставшихся к прохождению элементов на 1
  50.             cmp dl, 0    //Сравниваем это значение с 0
  51.             jne START    //Если НЕ 0, то переходим на метку начала и заново проходим алгоритм
  52.             jmp FIN      // Если 0 то переходим в ветку FIN
  53.  
  54.         FIN :            // конечная метка, за ней следует конец программы
  55.         mov k, bl        // кладем количество полученных элементов в ячейку памяти для K
  56.             mov sum, cl     //
  57.  
  58.     }
  59.         puts("The array A:");       //Выводим массив A и адреса элементов массива
  60.         for (int i = 0; i < SIZE_ARRAY; i++) {
  61.             printf("%d:\t%p\n", A[i], A + i);
  62.         }
  63.         puts("\nThe array B:");     //Выводим массив В
  64.         for (int i = 0; i < k; i++) {
  65.             printf("%d\t", B[i]);
  66.         }
  67.         puts("\nThe array C:");     //Выводим массив С
  68.         for (int i = 0; i < k; i++) {
  69.             printf("%p\t", C[i]);
  70.         }
  71.         printf("\nNumber of such elements:\t%d\n", k);  //Выводим количество элементов в массивах B и C
  72.  
  73.         return 0;
  74.     }
  75.  
  76.  
Advertisement
RAW Paste Data Copied
Advertisement