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

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

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

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

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

textual
Листинг программы
    movsx edx,Y
    or edx,edx
    jz exit
    movsx ebx,X
    or ebx,ebx
    jz exit
    mov ecx,17
        xor eax,eax
    jmp @0
@@: shr ebx,1
    jnc @0
    test ebx,1
    jnz @1
    add eax,edx
    jmp @1
@0:   test ebx,1
        jz @1
    sub eax,edx
@1: add edx,edx
    loop @b
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