Advertisement
gasaichan

some weird code

Dec 14th, 2018
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <time.h>
  3.  
  4. using namespace std;
  5.  
  6. void main() {
  7.     const int ARRAY_SIZE = 10;
  8.     // На это число делятся полученные генератором случайных чисел величины
  9.     // 100 для того, чтобы все полученные числа были двузначными
  10.     const __int16 RANDOM_DIVIDER = 100;
  11.     // На это число делятся значения из массива 1 при выполнении задания
  12.     const __int16 VALUE_DIVIDER = 3;
  13.     // Размер одного элемента массива
  14.     const char TYPE_SIZE = 2;
  15.     // Величина остатка от деления на VALUE_DIVIDER
  16.     const __int16 REMAINDER = 0;
  17.     //srand((int)time(0));
  18.  
  19.     setlocale(0, "rus");
  20.  
  21.  
  22.  
  23.     __int16 mas1[ARRAY_SIZE];
  24.     __int16 mas2[ARRAY_SIZE];
  25.  
  26.     _asm
  27.     {
  28.         LEA EBX, mas1;
  29.         MOV ECX, ARRAY_SIZE;
  30.     _RANDOM_LOOP:
  31.         rdtsc;
  32.         XOR DX, DX;
  33.         // AX = DX:AX / RANDOM_DIVIDER (200), remainder DX
  34.         DIV RANDOM_DIVIDER;
  35.         MOV[EBX], DX;
  36.         ADD EBX, 2;
  37.         LOOP _RANDOM_LOOP;
  38.     }
  39.  
  40.     cout << "Исходный массив: ";
  41.     for (int i : mas1) { cout << i << "\t"; }
  42.     cout << endl;
  43.  
  44.     // Если элемент первого массива кратен 3, поместить его на соответствующую позицию во второй массив,
  45.     // иначе поместить 0
  46.  
  47.     _asm {
  48.         LEA EBX, mas1;
  49.         MOV ECX, ARRAY_SIZE;
  50.  
  51.     _LOOP:
  52.         MOV AX, [EBX];
  53.         // AX = DX:AX / VALUE_DIVIDER (3), remainder DX
  54.         XOR EDX, EDX;
  55.         PUSH AX;
  56.         DIV VALUE_DIVIDER;
  57.         POP AX;
  58.         CMP DX, REMAINDER;
  59.         JE _SET_VALUE;
  60.         PUSH EBX;
  61.         LEA EBX, mas2;
  62.         // AX = AL * TYPE_SIZE (2)
  63.         XOR EAX, EAX;
  64.         MOV EAX, ARRAY_SIZE;
  65.         // EAX = ARRAY_SIZE - ECX. Так мы получаем индекс элемента, с которым работаем в данный момент
  66.         SUB EAX, ECX;
  67.         MUL TYPE_SIZE;
  68.         ADD EBX, EAX;
  69.         MOV AX, 0;
  70.         MOV[EBX], AX;
  71.         JMP _LOOP_CONTROL;
  72.     _SET_VALUE:
  73.         PUSH EBX;
  74.         LEA EBX, mas2;
  75.         PUSH AX;
  76.         // AX = AL * TYPE_SIZE (2)
  77.         XOR EAX, EAX;
  78.         MOV EAX, ARRAY_SIZE;
  79.         // EAX = ARRAY_SIZE - ECX. Так мы получаем индекс элемента, с которым работаем в данный момент
  80.         SUB EAX, ECX;
  81.         MUL TYPE_SIZE;
  82.         ADD EBX, EAX;
  83.         XOR EAX, EAX;
  84.         POP AX;
  85.         MOV[EBX], AX;
  86.         JMP _LOOP_CONTROL;
  87.     _LOOP_CONTROL:
  88.         POP EBX;
  89.         ADD EBX, 2;
  90.         LOOP _LOOP;
  91.     }
  92.  
  93.     cout << "Массив с замененными элементами: ";
  94.     for (int i : mas2) { cout << i << "\t"; }
  95.     cout << endl;
  96.     system("pause");
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement