Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов [tasm] - Assembler
Формулировка задачи:
Надо решить задачу
Задать с клавиатуры два массива из 10 элементов каждый. Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов.
Предусмотреть:
1) Приглашение к вводу массива
2) Проверку разрядности вводимых элементов n<3
3)Сообщение об ошибке
4) Вывод сформированного массива
На всякий случай, иногда в линковке нужно приписывать +ioproc.obj (например tlink.exe 123.obj+ioproc.obj). Если надо будет, то ioproc у меня есть.
Решение задачи: «Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов [tasm]»
textual
Листинг программы
LOCALS .model small .stack 100h .data msgInputA db 'Input A:', 0Dh, 0Ah, '$' msgInputB db 'Input B:', 0Dh, 0Ah, '$' msgOutputC db 'Output C:', 0Dh, 0Ah, '$' PromptA db 'A[', '$' PromptB db 'B[', '$' PromptEnd db ']=', '$' CrLf db 0Dh, 0Ah, '$' msgErrorFmt db 'Format error - non-numeric input', 0Dh, 0Ah, '$' msgErrorBig db 'Too a large number', 0Dh, 0Ah, '$' SizeArray equ 10 A dw SizeArray dup (0) B dw SizeArray dup (0) C dw SizeArray dup (0) kbdBuffer db 6, 0, 6 dup(0) .code ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 ; cx - основание системы счисления xor di, di ; di - кол. цифр в числе @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp ; преобразования строки в беззнаковое число ; на входе: ; ds:[si] - строка с числом ; ds:[di] - адрес числа ; на выходе ; ds:[di] - число ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен) Str2Num proc push ax push bx push cx push dx push ds push es push ds pop es mov cl, ds:[si] xor ch, ch inc si mov bx, 10 xor ax, ax @@Loop: mul bx ; умножаем ax на 10 ( dx:ax=ax*bx ) mov [di], ax ; игнорируем старшее слово cmp dx, 0 ; проверяем, результат на переполнение jnz @@Error mov al, [si] ; Преобразуем следующий символ в число cmp al, '0' jb @@Error cmp al, '9' ja @@Error sub al, '0' xor ah, ah add ax, [di] jc @@Error ; Если сумма больше 65535 inc si loop @@Loop mov [di], ax clc pop es pop ds pop dx pop cx pop bx pop ax ret @@Error: xor ax, ax mov [di], ax stc pop es pop ds pop dx pop cx pop bx pop ax ret Str2Num endp ;Ввод массива ;cx - количество вводимых элементов ;ds:dx - адрес массива ;ds:bx - адрес строки приглашения к вводу (первой половинки) InputArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: ;вывод приглашения ввода элемента mov ah, 09h ;lea dx, PromptA1 mov dx, bx int 21h mov ax, si call Show_AX mov ah, 09h lea dx, PromptEnd int 21h ;ввод числа mov ah, 0Ah ;ввод строки mov dx, offset kbdBuffer int 21h mov ah, 09h ;перевод строки (на новую строку) lea dx, CrLf int 21h push si lea si, kbdBuffer+1 ; преобразование строки в число call Str2Num pop si ; проверка на ошибку ввода (формата) jnc @@NoError ; если есть ошибка ввода - показать сообщение и повторить ввод lea dx, msgErrorFmt @@ShowErrMsg: ;сообщение об ошибке mov ah, 09h int 21h jmp @@ForI ; если нет ошибки ввода - сохранить число @@NoError: ;дополнительная проверка разрядности числа lea dx, msgErrorBig cmp word ptr [di], 1000 jge @@ShowErrMsg ;сохранение введённого числоа в массиве ;mov [di], ax ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret InputArray endp ;Вывод массива ;cx - количество вводимых элементов ;ds:dx - адрес массива ShowArray proc push ax push bx push cx push dx push si push di jcxz @@Exit ;если массив пустой - завершить mov si, 1 ;индекс элемента массива mov di, dx ;адрес текущего элемента массива @@ForI: mov ax, [di] call Show_AX mov ah, 02h mov dl, ' ' int 21h ;переход к следующему элементу inc si add di, 2 loop @@ForI @@Exit: pop di pop si pop dx pop cx pop bx pop ax ret ShowArray endp main proc mov ax, @data mov ds, ax ;ввод массива A mov ah, 09h lea dx, msgInputA int 21h mov cx, SizeArray lea dx, A lea bx, PromptA call InputArray ;ввод массива B mov ah, 09h lea dx, msgInputB int 21h mov cx, SizeArray lea dx, B lea bx, PromptB call InputArray ;вычисление массива C mov si, 0 mov cx, SizeArray @@For: mov ax, A[si] add ax, B[si] mov C[si], ax ;C[si]:=A[si]+B[si] add si, 2 ;увеличиваем смещение в массиве на размер элемента loop @@For ;вывод массива C mov ah, 09h lea dx, msgOutputC int 21h lea dx, C mov cx, SizeArray call ShowArray mov ax, 4C00h int 21h main endp end main
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д