Умножение/деление (сдвиг) - 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
- выполняется цикл с меткой@b
17 раз (заданное изначально значение переменнойecx
).exit: ...
- выполняются действия, определенные внутри меткиexit
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д