; Ввод данных
section .data
prompt db "Введите число: ", 0
section .bss
num resd 1
prod resd 1
section .text
global _start
_start:
mov eax, prompt
call print_string
; Вводим первое число
mov edx, num
mov ecx, 0
mov ebx, 1
int 0x80
mov [prod], eax
; Цикл для ввода остальных чисел
loop_input:
cmp eax, 0 ; Если число равно 0, то выходим из цикла
je loop_exit
imul [prod], eax ; Умножаем произведение на введенное число
; Вводим следующее число
mov edx, num
mov ecx, 0
mov ebx, 1
int 0x80
jmp loop_input
loop_exit:
; Вывод результата
mov eax, prod
call print_number
; Завершение программы
mov eax, 1
xor ebx, ebx
int 0x80
print_string:
push ebp
mov ebp, esp
push edx
mov edx, [ebp + 8]
mov esi, edx
lodsb
test al, al
jz done_printing
mov ah, 0x0E
int 0x10
inc edx
jmp short repeat
done_printing:
pop edx
leave
ret
print_number:
push ebp
mov ebp, esp
push edx
mov edx, [ebp + 8]
mov ecx, edx
shr ecx, 2
and ecx, 0xF
add edx, 48
mov bl, cl
mov bh, 0
mov ah, 0x02
int 0x21
dec edx
repeat:
mov cl, byte [edx]
sub cl, '0'
add edx, 1
push edx
mov ah, 0x02
int 0x21
pop edx
loop repeat
pop edx
leave
ret
section .data
prompt db 'Введите количество чисел: ', 0
format db '%d', 0
product_msg db 'Произведение чисел: %d', 10, 0
number db 0
section .bss
count resb 1
product resd 1
section .text
extern printf, scanf
global main
main:
; Запросить у пользователя количество чисел
mov rdi, prompt
call printf
; Прочитать количество чисел
lea rsi, [count]
mov rdi, format
call scanf
; Устанавливаем начальное произведение в 1
mov dword [product], 1
; Устанавливаем счётчик
movzx rbx, byte [count] ; количество чисел в rbx
; Начало цикла
next_number:
cmp rbx, 0 ; Проверяем, не ноль ли счётчик
je done ; Если 0, переходим к завершению
; Считываем число
mov rdi, format
lea rsi, [number]
call scanf
; Умножаем на текущее число
mov eax, [product]
imul eax, [number]
mov [product], eax
; Уменьшаем счётчик
dec rbx
jmp next_number ; Переходим к следующему числу
done:
; Вывод произведения
mov rdi, product_msg
mov eax, [product]
call printf
ret
возможных циклов в Assembler (LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ). В пункте
описывается то, что должно быть в цикле.
задание
Вычислить произведение введенных чисел пользователем.