Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите пожалуйста на писать код на ассемблере

maks 3d3 Ученик (51), открыт 3 недели назад
В задании использовать минимум одно условие и один переход, использовать все варианты
возможных циклов в Assembler (LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ). В пункте
описывается то, что должно быть в цикле.
задание
Вычислить произведение введенных чисел пользователем.
3 ответа
Артем Бикбаев Знаток (280) 3 недели назад
Вот пример кода на ассемблере, который вычисляет произведение введенных пользователем чисел, используя различные циклы и условия. В этом примере мы будем использовать x86 ассемблер с синтаксисом NASM.
asm

Копировать код
section .data
prompt db "Введите количество чисел: ", 0
prompt_num db "Введите число: ", 0
result_msg db "Произведение: ", 0
num db 0
count db 0
product dw 1

section .bss
input resb 10

section .text
global _start

_start:
; Запросить количество чисел
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, prompt ; сообщение
mov edx, 30 ; длина сообщения
int 0x80

; Считать количество чисел
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov ecx, input ; буфер для ввода
mov edx, 10 ; максимальная длина
int 0x80

; Преобразовать строку в число
mov ecx, 0 ; обнуляем счетчик
movzx eax, byte [input] ; берем первый символ
sub eax, '0' ; преобразуем в число
mov [count], al ; сохраняем количество чисел

; Инициализируем произведение
mov ax, 1 ; начальное значение произведения
mov [product], ax

; Цикл для ввода чисел
input_loop:
movzx ecx, byte [count] ; загружаем количество чисел
cmp ecx, 0 ; проверяем, не равно ли нулю
je done ; если 0, переходим к завершению

; Запросить число
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, prompt_num ; сообщение
mov edx, 20 ; длина сообщения
int 0x80

; Считать число
mov eax, 3 ; sys_read
mov ebx, 0 ; stdin
mov ecx, input ; буфер для ввода
mov edx, 10 ; максимальная длина
int 0x80

; Преобразовать строку в число
movzx eax, byte [input] ; берем первый символ
sub eax, '0' ; преобразуем в число
movzx ebx, byte [count] ; загружаем количество чисел
dec ebx ; уменьшаем на 1
mov [count], bl ; сохраняем новое количество

; Умножаем на текущее произведение
mov ax, [product] ; загружаем текущее произведение
imul ax, eax ; умножаем на введенное число
mov [product], ax ; сохраняем новое произведение

jmp input_loop ; повторяем цикл

done:
; Выводим результат
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, result_msg ; сообщение
mov edx, 15 ; длина сообщения
int 0x80

; Преобразуем произведение в строку для вывода
; (здесь можно добавить код для преобразования числа в строку)

; Завершение программы
mov eax, 1 ; sys_exit
xor ebx, ebx ; код возврата 0
int 0x80
Объяснение кода:

Запрос количества чисел: Программа запрашивает у пользователя, сколько чисел он хочет ввести.

Цикл ввода чисел: Используется цикл для ввода каждого числа. Внутри цикла программа запрашивает число, преобразует его из строки в число и умножает на текущее произведение.

Условия и переходы: Используются условия для проверки, сколько чисел осталось вводить, и переходы для управления потоком выполнения.
Примечание:

Этот код является базовым примером и может потребовать доработки, особенно в части преобразования чисел в строки для вывода результата.

Убедитесь, что у вас установлен NASM и вы знаете, как компилировать и запускать ассемблерные программы на вашей
Евгений Николаевич Гуру (2842) 3 недели назад
А как же воспользоваться нейронкой?
Рустам Абдрашитов Мудрец (15149) 3 недели назад
На
 .model small 
.stack 100h
.data
msg1 db 'Enter number (0 to finish): $'
msg2 db 13, 10, 'Product is: $'
product dw 1 ; Для хранения произведения
temp dw 0 ; Временная переменная
count db 0 ; Счетчик введенных чисел

.code
start:
mov ax, @data
mov ds, ax

input_loop:
; Вывод приглашения
mov dx, offset msg1
mov ah, 9
int 21h

; Ввод числа
mov ah, 1
int 21h

; Преобразование ASCII в число
sub al, '0'
mov ah, 0
mov temp, ax

; Проверка на ввод 0 (условие выхода)
cmp temp, 0
je print_result

; Умножение на введенное число
mov ax, product
mul temp
mov product, ax

; Увеличение счетчика
inc count

; Демонстрация LOOP
mov cl, 1
delay_loop:
loop delay_loop

; Демонстрация LOOPE/LOOPZ
mov cx, 5
mov al, 0
equal_loop:
cmp al, 0
loope equal_loop

; Демонстрация LOOPNE/LOOPNZ
mov cx, 5
mov al, 1
not_equal_loop:
cmp al, 0
loopne not_equal_loop

jmp input_loop

print_result:
; Проверка, было ли введено хотя бы одно число
cmp count, 0
je exit

; Вывод сообщения о результате
mov dx, offset msg2
mov ah, 9
int 21h

; Преобразование числа в ASCII и вывод
mov ax, product
mov bx, 10
mov cx, 0

convert_loop:
mov dx, 0
div bx
push dx
inc cx
test ax, ax
jnz convert_loop

print_loop:
pop dx
add dl, '0'
mov ah, 2
int 21h
loop print_loop

exit:
mov ah, 4ch
int 21h
end start
maks 3d3Ученик (51) 3 недели назад
сможешь скинуть как он работает пожалуйста а то выдаёт ошибку мне
maks 3d3, не скинет, это забытые тайные знания.
Похожие вопросы