ARM Assembler. Программа для умножения в дополнительном коде

Я студент и в ассемблере полный 0, GPT не помогает(( Нужна программа которая реализует Умножение целых чисел со знаком в дополнительном коде с неподвижной суммой частичных произведений, сдвигом множимого вправо и анализом множителя, начиная со старших разрядов с предварительным изменением знака. Если по пунктам то необходимо ввести числа в 10й с/с, преобразовать их в дополнительный код. После преобразования в дк необходимо ещё раз преобразовать их в дк (сделать инверсию и добавить 1 к младшему разряду). После этих манипуляций необходимо провести умножение путем перемножения каждого разряда множителя на множимое со сдвигом вправо,провести сложение промежуточных произведений и вывести результат в один из регистров. Если кто-то сможет с этим помочь, буду благодарен. Вот код который смог сделать Chat GPT `.global _start

.section .data A: .word 10 @ Пример значения числа A (замените на свое значение) B: .word -5 @ Пример значения числа B (замените на свое значение) ResultA: .space 4 @ Результат конвертации числа A ResultB: .space 4 @ Результат конвертации числа B

.section .text _start: @ Преобразование числа A в дополнительный код ldr r0, =A ldr r1, [r0] mvn r2, r1 add r2, r2, #1 str r2, [r0]

@ Преобразование числа B в дополнительный код
ldr r0, =B
ldr r1, [r0]
mvn r2, r1
add r2, r2, #1
str r2, [r0]

@ Умножение A на B
ldr r0, =A    @ Загрузка A в r0
ldr r1, =B    @ Загрузка B в r1
ldr r2, [r1]  @ Загрузка значения B в r2
ldr r3, [r0]  @ Загрузка значения A в r3
mov r4, #0    @ Инициализация счетчика цикла
mov r5, #0    @ Инициализация переменной для хранения результата

multiply_loop: cmp r2, #0 @ Проверка на конец множителя beq multiply_done @ Если множитель равен нулю, завершить умножение

and r6, r2, #1  @ Получение младшего бита множителя
cmp r6, #1      @ Проверка младшего бита
beq add_A_to_result  @ Если младший бит равен 1, прибавить A к результату

add r3, r3, r3 @ Сдвиг A влево (умножение на 2)
add r2, r2, r2 @ Сдвиг множителя влево (деление на 2)
b multiply_loop @ Переход к следующей итерации цикла

add_A_to_result: add r5, r5, r3 @ Прибавление A к результату add r3, r3, r3 @ Сдвиг A влево (умножение на 2) add r2, r2, r2 @ Сдвиг множителя влево (деление на 2) b multiply_loop @ Переход к следующей итерации цикла

multiply_done: @ Теперь r5 содержит результат умножения A на B @ Можно выполнить необходимые операции с результатом здесь @ Например, можно сохранить результат в памяти или вывести на экран

@ Завершение программы
swi 0         @ Вызов прерывания программного обеспечения для завершения программы

`


Ответы (0 шт):