Сформировать третий массив, записав в него суммы соответствующих элементов первого и второго массива - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени! Не могу решить задачку: Ввести два массива одинаковой длины. Сформировать третий массив, записав в него суммы соответствующих элементов первого и второго массива. В полученном массиве найти максимальный элемент. при этом размер массива задавать с клавиатуры, как и его элементы. Написать на tasm или fasm . и на win7 Был один вариант, но препод сказал сделать иначе. Помогите, пожалуйста

Решение задачи: «Сформировать третий массив, записав в него суммы соответствующих элементов первого и второго массива»

textual
Листинг программы
;sum312.asm
;Ввести два массива одинаковой длины. Сформировать третий массив, записав в ;него суммы соответствующих элементов первого и второго массива. В полученном ;массиве найти максимальный элемент
model small
SZ equ 10 ; размеры массивов 1,2
.stack 256
.data
ar1 dw SZ dup (0) ;память для массива 1
ar2 dw SZ dup (0) ;память для массива 2
ar3 dw SZ dup (0) ;память для массива 3
buf db 7,10 Dup(?) ; допуск-ся ввод всего 5 символов, минус и 1 служебный
first dw(0) ; всп. переменная для нахождения макс эл-та
mes11 db 13,10,"Vvedite chislo massiva 1 $"
mes12 db 13,10,"Vvedite chislo massiva 2 $"
mes6 db 13,10, "Massiv N1 = $"
mes7 db 13,10, "Massiv N2 = $"
mes8 db 13,10, "Oshibka pri vvode! Povtorite vvod = $"
mes9 db 13,10, "Max element 3-go massiva = $"
mes10 db 13,10, "Massiv N3 = $"
newl db 13,10,'$' ; перевод на новую строку
.code
print macro ad ; макро вывода строки ad на экран
push ax
push dx
mov ah,9
mov dx,offset ad
int 21h
pop dx
pop ax
endm
putc macro a ; макро вывода символа а на экран
push ax
push dx
mov ah,2
mov dl,a
int 21h
pop dx
pop ax
endm
;
inp5z proc near ; процедура ввода числа (слова) через буфер со знаком
push cx
push bx
push si
push di
mov ah,0ah
xor di,di
mov dx,offset buf ; адрес буфера
int 21h ; принимаем строку
; обрабатываем содержимое буфера
xor cx,cx
mov si,offset buf+2 ; берем адрес начала строки
cmp byte ptr [si],"-" ; если первый символ минус
jnz ii1
mov di,1 ; устанавливаем флаг
inc si ; и пропускаем его
ii1:
xor ax,ax
mov bx,10 ; основание сc (10)
ii2:
mov cl,[si] ; берем символ из буфера
cmp cl,0dh ; проверяем не последний ли он
jz endin
 
; если символ не последний, то проверяем его на правильность
cmp cl,'0' ; если введен неверный символ <0
jl er2
cmp cl,'9' ; если введен неверный символ >9
ja er2
 
sub cl,'0' ; делаем из символа число 
mul bx ; умножаем на 10
jo er2 ; проверка на возможное переполнение
jc er2
add ax,cx ; прибавляем к остальным
test ax,8000h ; число должно быть положительным ( у нас же модуль)
jnz er2 
inc si ; указатель на следующий символ
jmp ii2 ; повторяем до символа 0dh в строке
 
er2: ; если была ошибка, то выводим сообщение об этом и выходим
; soob errv
stc
jmp ii3
 
; все символы из буфера обработаны число находится в ax
endin:
cmp di,1 ; если установлен флаг знака, то
jnz ii8
neg ax ; делаем число отрицательным
ii8: clc
jmp ii7
ii3: nop
ii7: pop di
pop si
pop bx
pop cx
ret
inp5z endp
 
outint proc near ; процедура вывода числа из ax со знаком
push cx
push bx
; Проверяем число на знак.
test ax, ax
jns oi1
 
; Если оно отрицательное, выведем минус и оставим его модуль.
mov cx, ax
mov ah, 02h
mov dl, '-'
int 21h
mov ax, cx
neg ax
; Количество цифр будем держать в CX.
oi1: 
xor cx, cx
mov bx, 10 ; основание сс. 10 для десятеричной и т.п.
oi2:
xor dx,dx
div bx
; Делим число на основание сс. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
push dx
inc cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
test ax, ax
jnz oi2
; Теперь приступим к выводу.
mov ah, 02h
oi3:
pop dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
add dl, '0'
int 21h
; Повторим ровно столько раз, сколько цифр насчитали.
loop oi3
pop bx
pop cx
ret
outint endp 
 
; *****************************************************************
 
start: ; точка входа в программу
mov ax,@data ; инициализация DS
mov ds,ax
mov cx, SZ ; инициализация счетчика цикла ввода в массив 1 
mov bx,offset ar1 ; bx = адрес массива 1
lp21: print mes11 ; приглашение к вводу очередного эл-та массива 1
call inp5z ; ввод очередного числа
jc olu1 ; если ошибка при вводе, то на выход из цикла
mov word ptr [bx],ax ; иначе - вводим число в массив 1
dt1: add bx,2 ; переход на адрес след эл-та массива 1
loop lp21 ; цикл ввода в массив 1
jmp vvvm2
olu1: print mes8 ; печать
сообщения об ошибке при вводе
jmp lp21 ; повтор ввода
; ************************вывод массива 1 на экран **************
vvvm2: print mes6 ; сообщение о содержимом массива 1
mov cx, SZ
mov bx, offset ar1 ; в bx адрес начала массива 1
print newl ; переход на новую строку
omas1: mov ax, [bx] ; ax = текущий выводимый элемент массива 1
call outint ; вывод текущего элемента массива 1 на экран из ax
putc ' ' ; вывод разделителя (пробел)
add bx,2 ; инкремент на следующий элемент массива 1 
loop omas1 ; цикл вывода массива 1 на экран
; *********************** ввод в массив 2
vvv2: mov cx,SZ ; инициализация счетчика цикла ввода в массив 2
mov first,0
mov bx,offset ar2 ;bx = адрес массива 2
lp22: print mes12 ; приглашение к вводу очередного эл-та массива 2
call inp5z ; ввод очередного числа
jc olu2 ; если ошибка при вводе, то на выход из цикла
mov word ptr [bx],ax ; иначе - вводим число в массив 2
dt2: add bx,2 ; переход на адрес след эл-та массива 2
loop lp22 ; цикл ввода в массив 2
jmp xx2
olu2: print mes8 ; печать сообщения об ошибке при вводе
jmp lp22 ; повтор ввода
; ************************вывод массива 2 на экран **************
xx2: print mes7 ; сообщение о выводе массива 2
mov cx, SZ
mov bx, offset ar2 ;bx = адрес массива 2
print newl ; переход на новую строку
omas2: mov ax, [bx] ; ax = текущий выводимый элемент массива 2
call outint ; вывод текущего элемента массива 2 на экран из ax
putc ' ' ; вывод разделителя (пробел)
add bx,2 ; инкремент на следующий элемент массива 2
loop omas2 ; цикл вывода массива 2 на экран
nop
nop ; nop для отладки
mov cx,SZ 
mov bx,offset ar1 ; bx = индекс массива №1
mov si,offset ar2 ; si = индекс массива №2
mov di,offset ar3 ; di = индекс массива №3
sum3: mov ax,[bx] ; суммирование элементов массива 1,2 с одинаковыми ;индексами
add ax,[si]
mov ds:[di],ax ; и запись сумм в 3-й массив
add bx,2 ; наращивание индексов всех массивов
add si,2
add di,2
loop sum3 ; цикл
; ***********************вывод массива 3 на экран
print mes10 ; сообщение о выводе массива 3
mov cx, SZ
mov bx, offset ar3 ;bx = адрес массива 3
print newl ; переход на новую строку
omas3: mov ax, [bx] ; ax = текущий выводимый элемент массива 3
call outint ; вывод текущего элемента массива 3 на экран из ax
putc ' ' ; вывод разделителя (пробел)
add bx,2 ; инкремент на следующий элемент массива 3
loop omas3 ; цикл вывода массива 3 на экран
; определение макс эл-та массива 3
mov cx,SZ 
mov bx,offset ar3
wsum: mov ax,[bx]
cmp first,1 ; если вход в массив не первый, то на сравнение
je srav
mov bp,ax ; в bp = max (?)
mov first,1 ; инверсия признака "первый" вход
jmp dt11
srav: cmp ax,bp ; нахождение максимума
jng dt11
mov bp,ax ; очередной максимум в bp
dt11: add bx,2 
loop wsum ;цикл
; вывод максимума массива 3 на экран 
print mes9
mov ax,bp
call outint
vixx: mov ax, 0 ; ожидание нажатия любой клавиши
int 16h
mov ax, 4c00h
int 21h ; выход из программы
end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.5 из 5
Похожие ответы