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