Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов [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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д