Два одномерных массива поэлементно сложить между собой - третий - сложить каждый элементы - вывести на экран - Assembler/emu8086
Формулировка задачи:
2 одномерных массива - сложить между собой - третий - сложить каждый элементы - вывести на экран.
Помогите написать программу на эмуляторе (emu8086).
Решение задачи: «Два одномерных массива поэлементно сложить между собой - третий - сложить каждый элементы - вывести на экран»
textual
Листинг программы
_STACK segment para stack db 1024 dup(?) _STACK ends _DATA segment CrLf db 0Dh, 0Ah, '$' msgPressAnyKey db 0Dh, 0Ah, 'Press any key to exit...', '$' msg1st db 0Dh, 0Ah, '1st array:', 0Dh, 0Ah, '$' msg2nd db 0Dh, 0Ah, '2nd array:', 0Dh, 0Ah, '$' msg3rd db 0Dh, 0Ah, '3rd array (1st + 2nd):', 0Dh, 0Ah, '$' msgSum db 0Dh, 0Ah, 'Summa (3rd): ', '$' N dw 8 _1st dw -40, 29, 84, -66, 10, -62, 95, 82, -67, -90 _2nd dw 20, 100, 75, 5, -46, 95, 52, -104, -30, -109 _3rd dw 10 dup(?) Sum dw ? _DATA ends _TEXT segment assume cs:_TEXT, ds:_DATA, ss:_STACK main proc ;инициализация сегментного регистра данных mov ax, _DATA mov ds, ax ;вывод исходных данных ; - 1-й массив mov ah, 09h lea dx, [msg1st] int 21h lea dx, [_1st] mov cx, [N] call ShowArray ; - 2-й массив mov ah, 09h lea dx, [msg2nd] int 21h lea dx, [_2nd] mov cx, [N] call ShowArray ;поэлементное суммирование lea si, [_1st] lea di, [_2nd] lea bx, [_3rd] mov cx, [N] @@For: mov ax, [si] add ax, [di] mov [bx], ax add si, 2 add di, 2 add bx, 2 loop @@For ; - 3-й массив mov ah, 09h lea dx, [msg3rd] int 21h lea dx, [_3rd] mov cx, [N] call ShowArray ;сложить все элементы третьего массива lea si, [_3rd] mov cx, [N] mov dx, 0 @@For3: lodsw add dx, ax loop @@For3 mov [Sum], dx ;вывод суммы mov ah, 09h lea dx, [msgSum] int 21h mov ax, [Sum] call Show_AX ;завершение программы mov ah, 09h lea dx, [msgPressAnyKey] int 21h mov ah, 0 int 16h ;завершение программы mov ax, 4C00h int 21h main endp ;Вывод массива слов (word) ;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 ; выводит знаковое 16-разрядное число из регистра AX на экран ; с выравниванием на 8 позиций по правому краю ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push si push di mov cx, 10 ;основание системы счисления xor di, di ; di - кол. цифр в числе xor si, si ; si - признак отрицательного числа ; если число в ax отрицательное, то ;1) напечатать (запомнить в стеке) символ '-' ;2) сделать ax положительным or ax, ax jns @@Conv mov si, 1 neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ;если число отрицательное - помещаем символ "-" в строку or si, si jz @@Positive mov dx, '-' push dx inc di @@Positive: ; выводим из стека на экран ; - сначала пробелы для выравнивания по правому краю mov cx, 8 sub cx, di mov ah, 02h mov dl, ' ' @@LeftPad: int 21h loop @@LeftPad ;сохранённые символы цифр @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop si pop dx pop cx pop bx pop ax ret Show_AX endp _TEXT ends end main