Помогите, пожалуйста, написать код на ассемблере.
В задании использовать минимум одно условие и один переход, использовать все варианты
возможных циклов в Assembler (LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ). В пункте
описывается то, что должно быть в цикле.
задание
Вычислить произведение введенных чисел пользователям
section .data
prompt db "Введите число (0 для завершения): ", 0
result_msg db "Произведение чисел: ", 0
newline db 10, 0 ; Перевод строки
section .bss
num resb 4 ; Буфер для хранения введенного числа
product resd 1 ; Переменная для хранения произведения
section .text
global _start
_start:
; Инициализация произведения
mov dword [product], 1
input_loop:
; Вывод запроса ввода
mov eax, 4
mov ebx, 1
mov ecx, prompt
mov edx, 29
int 0x80
; Считываем число от пользователя
mov eax, 3
mov ebx, 0
mov ecx, num
mov edx, 4
int 0x80
; Преобразуем введенный символ в число
mov eax, [num] ; Загружаем введенный символ
sub eax, '0' ; Преобразуем ASCII-символ в число
cmp eax, 0 ; Проверяем, является ли число 0
je end_input ; Если да, завершаем ввод
; Умножаем текущее произведение на новое число
mov ebx, [product]
mul ebx ; EAX = EAX * EBX
mov [product], eax
; Переходим к следующей итерации
jmp input_loop
end_input:
; Вывод результата
mov eax, 4
mov ebx, 1
mov ecx, result_msg
mov edx, 18
int 0x80
; Преобразуем результат в строку для вывода
mov eax, [product]
call print_number
; Выводим перевод строки
mov eax, 4
mov ebx, 1
mov ecx, newline
mov edx, 1
int 0x80
; Выход из программы
mov eax, 1
xor ebx, ebx
int 0x80
; Процедура для вывода числа
print_number:
push ebx ; Сохраняем регистры
push ecx
push edx
mov ecx, 10 ; Делимое для получения цифр
xor ebx, ebx ; Буфер для хранения цифр
mov edi, esp ; Используем стек для временного хранения цифр
digit_loop:
xor edx, edx ; Очищаем EDX перед делением
div ecx ; Делим EAX на 10 (EAX = EAX / ECX, EDX = остаток)
add dl, '0' ; Преобразуем остаток в ASCII-символ
dec esp ; Выделяем место на стеке
mov [esp], dl ; Сохраняем цифру на стеке
inc ebx ; Увеличиваем счетчик цифр
test eax, eax ; Проверяем, равен ли частное нулю
jnz digit_loop ; Если нет, продолжаем
print_digit_loop:
mov eax, 4 ; Системный вызов для вывода
mov ebx, 1 ; File descriptor (stdout)
lea ecx, [esp] ; Адрес очередной цифры
mov edx, 1 ; Количество байт для вывода
int 0x80 ; Вызываем системный вызов
inc esp ; Удаляем цифру со стека
dec ebx ; Уменьшаем счетчик цифр
jnz print_digit_loop ; Повторяем, пока не выведем все цифры
pop edx ; Восстанавливаем регистры
pop ecx
pop ebx
ret
Ангол ещё вспомни