Advertisement
EvgeniiKraaaaaaaav

asm 3.20 ASM

May 3rd, 2019
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.49 KB | None | 0 0
  1. //https://vk.com/evgenykravchenko0
  2.  
  3.                 ___                                        ___                   ___    
  4.                /  /\                  ___                 /  /\                 /  /\    
  5.               /  /:/_                /__/\               /  /:/_               /  /:/_  
  6.              /  /:/ /\               \  \:\             /  /:/ /\             /  /:/ /\  
  7.             /  /:/ /:/_               \  \:\           /  /:/_/::\           /  /:/ /:/_
  8.            /__/:/ /:/ /\          ___  \__\:\         /__/:/__\/\:\         /__/:/ /:/ /\
  9.            \  \:\/:/ /:/         /__/\ |  |:|         \  \:\ /~~/:/         \  \:\/:/ /:/
  10.             \  \::/ /:/          \  \:\|  |:|          \  \:\  /:/           \  \::/ /:/
  11.              \  \:\/:/            \  \:\__|:|           \  \:\/:/             \  \:\/:/  
  12.               \  \::/              \__\::::/             \  \::/               \  \::/  
  13.                \__\/                   ~~~~               \__\/                 \__\/    
  14.                             ___                                            
  15.                            /__/\                ___                 ___    
  16.                            \  \:\              /  /\               /  /\    
  17.                             \  \:\            /  /:/              /  /:/    
  18.                         _____\__\:\          /__/::\             /__/::\    
  19.                        /__/::::::::\         \__\/\:\__          \__\/\:\__
  20.                        \  \:\~~\~~\/            \  \:\/\            \  \:\/\
  21.                         \  \:\  ~~~              \__\::/             \__\::/
  22.                          \  \:\                  /__/:/              /__/:/
  23.                           \  \:\                 \__\/               \__\/  
  24.                            \__\/                      
  25.  
  26. #include "pch.h"
  27. #include <stdio.h>
  28. #include <locale.h>
  29. #include <cstdlib>
  30. int main()
  31. {
  32.     setlocale(LC_ALL, "rus");
  33.  
  34.     short number = 0;           // Используем short, т.к. его размер два байта
  35.     short result = 0;           // Используем short, т.к. его размер два байта
  36.  
  37.     printf_s("Enter number: \n");
  38.     scanf_s("%hi", &number);
  39.  
  40.     _asm
  41.     {
  42.             mov ax, number      // Записываем в ax значение переменной number. ax тоже размером 2 байта(15..0 биты)
  43.             xor bx, bx          // Обнуляем bx с помощью логической операции "искл. ИЛИ" размер тоже 2 байта(15..0 биты)
  44.                                 // В bx будем записывать ответ(поэтому и обнуляем)
  45.             xor si, si          // Обнуляем регистр общего назначения
  46.  
  47.             cmp ax, 0           // Сравниваем ax с 0, чтобы не пробегать весь цикл
  48.             jz exit             // Если ax будет равен операнду справа в cmp (то есть 0), то будет прыжок на метку exit
  49.  
  50.             mov cx, 16          // Организуем счетчик для цикла count_units(16, т.к. 16 бит нужно пройти)
  51.         count_units :           // Метка для цикла(Цикл считает кол-во единиц в заданном числе)
  52.  
  53.             shr ax, 1           // Исп. логический сдвиг вправо, где ax(число в котором будем сдвигать биты)
  54.                                 // а 1(на сколько будем сдвигать).Если снеслась крайний бит со значением 1, то CF=1
  55.                                 // ПРИМЕР: 1101 сдвинули вправо и стало 0110 (CF=1, т.к. единица ушла за границы записи)
  56.                                 // С каждым сдвигом CF меняется (если ушел ноль, то CF=0)
  57.                                 // Каждый сдвиг с другой стороны всегда будет смещаться 0
  58.            
  59.             jnc next            // Если CF=0, то переход на метку next(чтобы пропустить шаг и не прибавлять 1 к счетчику)
  60.                                 // Если CF=1, то мы встретили единицу в записи числа
  61.             add si, 1           // Значит прибавляем к si единицу
  62.         next :                  // Метка для прыжка
  63.             loop count_units    // (loop уменьшает cx на 1) если cx = 0, то выход из цикла
  64.  
  65.             xor cx, cx          // Обнуляем cx для следующего цикла с помощью xor
  66.                                 // В цикле ниже мы должны будем сдвинуть влево и прибавить 1 столько раз, сколько в si 1-иц
  67.             mov cx, si          // Проматывать будем столько раз , сколько мы подсчитали единиц в предыдущем цикле      
  68.         create_result :         // Метка цикла
  69.             shl bx, 1           // Логический сдвиг уже влево(работает так же как shr , только влево
  70.                                 // ПРИМЕР: 1101 сдвинули влево и стало 1010 (CF=1,т.к. единица ушла за границы записи)
  71.             add bx, 1           // Прибавляем 1 к числу(Ведь нам нужны единицы сначала, а потом нули)
  72.             loop create_result  // (loop уменьшает cx на 1) если cx = 0, то выход из цикла
  73.  
  74.  
  75.  
  76.         exit :                  // Метка exit
  77.             mov result, bx      // Записываем результат в result
  78.     }
  79.  
  80.     printf_s("Result is: %hi \n", result);
  81.  
  82.  
  83.     system("pause");
  84.     return 0;
  85. }
  86.  
  87. ===========================================================================================================================
  88. |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  89. ===========================================================================================================================
  90. ПРИМЕР ВЫПОЛНЕНИЯ НА 4 БИТАХ(ЧТОБЫ ДОЛГО НЕ ПИСАТЬ, СУТЬ ВСЯ ТАКАЯ ЖЕ) ПРОСТО ТАК МНЕ ПИСАТЬ МЕНЬШЕ БУДЕТ
  91. ===========================================================================================================================
  92. ПОСТУПИЛО ЧИСЛО ПУСТЬ 5
  93.  
  94. 5 В ДВОИЧНОЙ ЭТО 0101
  95. (У МЕНЯ ЧИСЛО В 4 БИТА ПОЭТОМУ Я ПРОЙДУСЬ 4 РАЗА, ЧТОБЫ ПРОВЕРИТЬ КАЖДЫЙ БИТ)
  96. !!!В ЗАДАНИИ 16 БИТ И ТАМ НУЖНО 16 РАЗ ПРОЙТИСЬ В ПЕРВОМ ЦИКЛЕ) ВСЕ ЛОГИЧНО
  97. СНАЧАЛА МЫ СЧИТАЕМ КОЛ-ВО ЕДИНИЦ
  98.  
  99. СДВИГАЕМ  0010 (CF = 1) тогда si увеличиваем на 1
  100. СДВИГАЕМ  0001 (CF = 0) переходим по метке, чтобы пропустить увеличение si на 1
  101. СДВИГАЕМ  0000 (CF = 1) тогда si увеличиваем на 1
  102. СДВИГАЕМ  0001 (CF = 0) переходим по метке, чтобы пропустить увеличение si на 1
  103.  
  104.  
  105. ТЕПЕРЬ Я ПЕРЕХОЖУ НА ВТОРОЙ ЦИКЛ si=2 ПОЭТОМУ В cx ЗАПИСЫВАЕМ si(ТО ЕСТЬ 2)
  106.  
  107. bx у нас все 0( Т.К. МЫ ЕГО ОБНУЛИЛИ В САМОМ НАЧАЛЕ)
  108. СДВИГАЮ 0000 (ПО СУТИ НАЧАЛО НЕ ИГРАЕТ РОЛИ , НО ПО ДРУГОМУ НИКАК)
  109.     ПРИБАВЛЯЮ 1 ( БУДЕТ 0001)
  110. СДВИГАЮ 0010
  111.     ПРИБАВЛЯЮ 1 (БУДЕТ 0011)
  112.  
  113. 0011 - НАШ ОТВЕТ
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement