Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.87 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <stdio.h>
  5.  
  6. using namespace std;
  7.  
  8. typedef unsigned short ushort;
  9. typedef char byte;
  10.  
  11. // delete s[i] symbol
  12. void erase(char s[], int i)
  13. {
  14.     int sizeEl = sizeof(char);
  15.     __asm
  16.     {
  17.         mov eax, i              // eax = i
  18.         add eax, 1              // eax = i + 1
  19.         imul eax, sizeEl        // eax = (i + 1)*sizeEl
  20.         add eax, s              // eax = (i + 1)*sizeEl + s
  21.  
  22.         L:
  23.             mov edx, eax        // edx = (i + 1)*sizeEl + s
  24.             sub edx, sizeEl     // edx = i*sizeEl + s
  25.  
  26.             mov bl, [eax]       // ebx = s[i + 1]
  27.             mov [edx], bl       // s[i] = s[i + 1]
  28.             cmp bl, '\0'        // s[i + 1] != '\n' ? L : exit
  29.             je END
  30.  
  31.             add eax, sizeEl     // eax = next s[i + 1]
  32.             jmp L
  33.  
  34.         END:
  35.     }
  36. }
  37.  
  38. // if(x < 2) y = 2 - x
  39. // else y = a + 3
  40. int function(int x, int a)
  41. {
  42.     int y;
  43.     __asm {
  44.         mov eax, x
  45.         cmp eax, 2
  46.         jge B
  47.         A : mov eax, 2 // x < 2  y = 2 - x
  48.             sub eax, x
  49.             mov y, eax
  50.             jmp END
  51.  
  52.         B : mov eax, a // x >= 2  y = a + 3
  53.             add eax, 3
  54.             mov y, eax
  55.  
  56.         END:
  57.     }
  58.     return y;
  59. }
  60.  
  61. // output binary number
  62. template<typename T>
  63. void binaryOut(T n, int b1, int b2)
  64. {
  65.     int start = sizeof(T) * 8 - 1;
  66.     if (b1 == -1) b1 = start + 1;
  67.     else b1--;
  68.  
  69.     if (b2 == -1) b2 = start + 1;
  70.     else b2--;
  71.  
  72.     for (int i = start; i >= 0; i--)
  73.     {
  74.         if (i == b1 || i == b2)
  75.         {
  76.             cout << '[' << ((n & (1 << i)) >> i) << ']';
  77.         }
  78.         else cout << ((n & (1 << i)) >> i);
  79.     }
  80.  
  81.     cout << endl;
  82. }
  83.  
  84. // swap 3 and 5 bits of number
  85. void bitSwap(int* val)
  86. {
  87.     // val += (3b - 5b) * 12
  88.     // swap(3b, 5b)
  89.     cout << "Default\n";
  90.     binaryOut(*val, 3, 5);
  91.  
  92.     __asm
  93.     {
  94.         mov ebx, val        // ebx = addr val
  95.  
  96.         mov eax, [ebx]      // eax = [val]
  97.         and eax, 16         // eax = 5 bit
  98.         shr eax, 4          //
  99.         mov edx, eax        // edx = 5 bit
  100.  
  101.         mov eax, [ebx]      // eax = [val]
  102.         and eax, 4          // eax = 3 bit
  103.         shr eax, 2          //
  104.  
  105.         sub eax, edx        // eax = 3bit - 5bit
  106.         mov edx, 12         // edx = 12
  107.  
  108.         imul edx            // eax = (3bit - 5bit) * 12
  109.         add eax, [ebx]      // eax = eax + [val]
  110.         mov [ebx], eax      // val = eax
  111.     }
  112.     cout << "Swap(3b, 5b)\n";
  113.     binaryOut(*val, 3, 5);
  114.  
  115.     // val *= 8
  116.     __asm
  117.     {
  118.         mov ebx, val        // ebx = addr val
  119.  
  120.         mov eax, [ebx]      // eax = [val]
  121.         shl eax, 3          // eax = val * 8
  122.         mov [ebx], eax      // val = eax
  123.     }
  124.     cout << "Val * 8\n";
  125.     binaryOut(*val, -1, -1);
  126.  
  127.     // NOT val
  128.     __asm
  129.     {
  130.         mov ebx, val        // ebx = addr val
  131.  
  132.         mov eax, [ebx]      // eax = [val]
  133.         not eax             // not eax
  134.         mov [ebx], eax      // val = eax
  135.     }
  136.     cout << "NOT val\n";
  137.     binaryOut(*val, -1, -1);
  138. }
  139.  
  140. // y = (5 + 9) / 3 - 16*3/(2 + 3) + (23/3)/3 - 2
  141. // notation 5 9 + 3 / 16 3 * 2 3 + / - 23 3 / 3 / + 2 -
  142. int expression()
  143. {
  144.     int y = 0;
  145.  
  146.     __asm
  147.     {
  148.        
  149.     }
  150.  
  151.     return y;
  152. }
  153.  
  154. // copy from Array.a to Array.b
  155. void copyArr(int* a, int* b, int n)
  156. {
  157.     int sizeEl;
  158.     int space;
  159.     __asm
  160.     {
  161.         mov sizeEl, type a // размер элемента
  162.  
  163.         mov eax, b          // eax = b
  164.         sub eax, a          // eax = b - a
  165.         mov space, eax      // смещение
  166.  
  167.         mov eax, n          // eax = n
  168.         dec eax             // eax = n - 1
  169.         mov ecx, eax        // ecx = n - 1
  170.  
  171.         mov ebx, a          // база
  172.  
  173.         // b[i] = <база> + <множитель> * <индекс> + <смещение>
  174.         // b[i] = a[ebx + sizeEl*ecx + space]
  175.  
  176.         L :
  177.             mov eax, ecx    // eax = ecx
  178.             mul sizeEl      // eax = ecx * sizeEl
  179.             add eax, ebx    // eax = ebx +
  180.             mov edx, [eax]  // edx = a[ecx]
  181.  
  182.             add eax, space  // memory of b[i] = ebx + sizeEl*ecx + space
  183.             mov [eax], edx  // b[ecx] = a[ecx]
  184.  
  185.             dec ecx         // ecx --
  186.         cmp ecx, 0          // ecx >= 0 ? L : exit
  187.         JGE L
  188.     }
  189. }
  190.  
  191. int main()
  192. {
  193.     int n;
  194.     cin >> n;
  195.     int* a = new int[n];
  196.     int* b = new int[n];
  197.     for (int i = 0; i < n; i++)
  198.         cin >> a[i];
  199.  
  200.     copyArr(a, b, n);
  201.  
  202.     for (int i = 0; i < n; i++)
  203.         cout << b[i] << ' ';
  204.  
  205.     cout << expression() << endl;
  206.  
  207.     int val;
  208.     cin >> val;
  209.     bitSwap(&val);
  210.  
  211.     int x, aVal;
  212.     cin >> x >> aVal;
  213.     cout << function(x, aVal) << endl;
  214.  
  215.     int i;
  216.     char s[256];
  217.     scanf("%255[^\n]", s);
  218.     scanf("%d", &i);
  219.     erase(s, i);
  220.     printf("%s", s);
  221.  
  222.     return 0;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement