Умножение/деление (сдвиг) - 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).
movsx edx, Y- в переменнуюedxзагружается значение переменнойY.or edx, edx- выполняется логическое ИЛИ переменнойedxс самой собой. Это проверяет, является лиedxравным нулю.jz exit- если после выполнения операцииorзначениеedxравно нулю, происходит переход к меткеexit.movsx ebx, X- в переменнуюebxзагружается значение переменнойX.or ebx, ebx- выполняется логическое ИЛИ переменнойebxс самой собой. Это проверяет, является лиebxравным нулю.jz exit- если после выполнения операцииorзначениеebxравно нулю, происходит переход к меткеexit.mov ecx, 17- в переменнуюecxзагружается значение 17.xor eax, eax- переменнаяeaxустанавливается в ноль.jmp @0- происходит безусловный переход к метке@0.shr ebx, 1- переменнаяebxделится на 2 путем сдвига битов вправо.jnc @0- если нет переноса (цифра четная), выполняется переход к метке@0.test ebx, 1- выполняется побитовое И переменнойebxс единицей.jnz @1- если после выполнения операцииtestрезультат ненулевой, выполняется переход к метке@1.add eax, edx- переменнаяeaxувеличивается на значение переменнойedx.jmp @1- происходит безусловный переход к метке@1.test ebx, 1- выполняется побитовое И переменнойebxс единицей.jz @1- если после выполнения операцииtestрезультат равен нулю, выполняется переход к метке@1.sub eax, edx- переменнаяeaxуменьшается на значение переменнойedx.add edx, edx- переменнаяedxудваивается.loop @b- выполняется цикл с меткой@b17 раз (заданное изначально значение переменнойecx).exit: ...- выполняются действия, определенные внутри меткиexit.