Умножение/деление (сдвиг) - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста с решением задачи. Вычислить следующее выражение и определить, четное полученное число или нечетное и отрицательное оно или положительное. Операции умножения и деления выполнять с помощью операций сдвига. Проверка на четность либо нечетность и знак (если числа со знаком) числа осуществлять с помощью логических побитовых команд. Ввод значений переменных организовать с клавиатуры. Вывод результата организовать на экран. Если размер результата будет более 16 бит – результат преобразовывать в 16-битный. F = Y - 96 * X / 16. Y и X- 8 битн. со знаком
Ребят, помогите с задачей. Пожалуйста. :с

Решение задачи: «Умножение/деление (сдвиг)»

textual
Листинг программы
  1.     movsx edx,Y
  2.     or edx,edx
  3.     jz exit
  4.     movsx ebx,X
  5.     or ebx,ebx
  6.     jz exit
  7.     mov ecx,17
  8.         xor eax,eax
  9.     jmp @0
  10. @@: shr ebx,1
  11.     jnc @0
  12.     test ebx,1
  13.     jnz @1
  14.     add eax,edx
  15.     jmp @1
  16. @0:   test ebx,1
  17.         jz @1
  18.     sub eax,edx
  19. @1: add edx,edx
  20.     loop @b
  21. exit:  ....

Объяснение кода листинга программы

В данном коде происходит умножение двух чисел X и Y с использованием операции сдвига (деления на 2).

  1. movsx edx, Y - в переменную edx загружается значение переменной Y.
  2. or edx, edx - выполняется логическое ИЛИ переменной edx с самой собой. Это проверяет, является ли edx равным нулю.
  3. jz exit - если после выполнения операции or значение edx равно нулю, происходит переход к метке exit.
  4. movsx ebx, X - в переменную ebx загружается значение переменной X.
  5. or ebx, ebx - выполняется логическое ИЛИ переменной ebx с самой собой. Это проверяет, является ли ebx равным нулю.
  6. jz exit - если после выполнения операции or значение ebx равно нулю, происходит переход к метке exit.
  7. mov ecx, 17 - в переменную ecx загружается значение 17.
  8. xor eax, eax - переменная eax устанавливается в ноль.
  9. jmp @0 - происходит безусловный переход к метке @0.
  10. shr ebx, 1 - переменная ebx делится на 2 путем сдвига битов вправо.
  11. jnc @0 - если нет переноса (цифра четная), выполняется переход к метке @0.
  12. test ebx, 1 - выполняется побитовое И переменной ebx с единицей.
  13. jnz @1 - если после выполнения операции test результат ненулевой, выполняется переход к метке @1.
  14. add eax, edx - переменная eax увеличивается на значение переменной edx.
  15. jmp @1 - происходит безусловный переход к метке @1.
  16. test ebx, 1 - выполняется побитовое И переменной ebx с единицей.
  17. jz @1 - если после выполнения операции test результат равен нулю, выполняется переход к метке @1.
  18. sub eax, edx - переменная eax уменьшается на значение переменной edx.
  19. add edx, edx - переменная edx удваивается.
  20. loop @b - выполняется цикл с меткой @b 17 раз (заданное изначально значение переменной ecx).
  21. exit: ... - выполняются действия, определенные внутри метки exit.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут