Массив: В масиве из 15 элементов найти сумму элементов от 4 до 9. - Assembler
Формулировка задачи:
На практике работаем с ассемблером, но толком никто не объясняет ничего.
Помогите, пожалуйста.
Задание: в масиве из 15 элементов найти сумму элементов от 4 до 9. Ввод массива с клавиатуры.
Понимаю, что задание не сложное. Но подскажите, пожалуйста, как сделать этот ручной ввод массива. Искала..но нашла без объяснений..и то мало. Не могу никак разобраться.Решение задачи: «Массив: В масиве из 15 элементов найти сумму элементов от 4 до 9.»
textual
Листинг программы
;-------------------------- Steck field ---------------------- sseg segment stack 'stack' db 128 dup(?) sseg ends ;================Data field=============== dseg segment 'data' text0 db 'Find sum of elements of array from 2 to 7.',13,10, '$' text1 db 'Input the array:' ,13,10 , '$' text2 db 10,13,'Sum of elements of array from 2 to 7 equal to $' MAS dw 10 dup (?) Sum dw ? Errstr db 10, 'String that was input is not a number.' , 13, 10, 'Please, repeat a lead-in: $' TEN dw 10 ;-------For derivation result converted in ASCII ------ Num dw ? ; Хранение переводимой переменной StrNum db 8 dup (?), '$' ; Хранение результата перевода Negate db ? ; Флаг отрицательности (исп. только в процедуре перевода) ;------------For input numbers from keyboard---------- NumPar label byte ; Структура для прерывания ДОС MaxLen db 8 ; Максимальная длинна поля ввода ActLen db ? ; Длина введенной строки NumFld db 8 dup (?) ; Строка ; -- For converting numbers from ASCII to binary --- MulFact db 10 ; Фактор для умножения SumTemp dw ? ; Результат перевода ; ------------------For check input numbers---------------- Good db ? ; Флажок правильности ввода числа dseg ends ;==============Text of program============ cseg segment 'code' assume cs:cseg, ds:dseg, ss:sseg start proc far mov ax, dseg mov ds, ax ;------------------------------------------------------------------- lea DX, text0 ; Вызывается в случае ошибки call WrStr lea DX, text1 call WrStr mov si, 0 mov cx, 10 m1: call ReadChislo mov ax, Num mov mas[si], ax add si,2 loop m1 m2: mov si, 0 mov cx, 10 m3: mov ax, mas[si] cmp ax, 2 jnge m4 cmp ax, 7 jnle m4 add Sum, ax m4: add si, 2 loop m3 m5: mov ax, sum cbw mov num, ax m6: lea dx, text2 call WrStr call strcon lea dx, strnum call WrStr mov ah, 4Ch int 21h start endp ; ------------------------------------------------------------------ WrStr proc push ax mov ah, 09h; Функция вывода строки на экран int 21h ; Прерывание ДОС pop ax ret ; Возврат из процедуры WrStr endp ; ------------------------------------------------------------------ ReadChislo proc push ax push bx push cx push dx push si xor cx,cx xor ax,ax xor bx,bx mov Negate, 0 mov ah, 01h int 21h cmp al,'-' jne do_while mov Negate,1 jmp end_while do_while: cmp al, '0' jb err cmp al, '9' ja err sub al,'0' cbw inc cx mov dx,ax mov ax,bx mov bx,dx xor dx,dx mul TEN add bx,ax end_while: mov ah, 01h int 21h jmp do_while err: cmp al,' ' jne err2 cmp cx,0 je err2 cmp Negate,0 je end_num neg bx end_num: mov Num,bx jmp end_proc err2: lea DX, errstr ; Вызывается в случае ошибки call WrStr ; Выводит сообщение о повторе ввода end_proc: pop si pop dx pop cx pop bx pop ax ret ; Возврат из процедуры ReadChislo endp StrCon proc push ax push cx push dx mov cx, 10 ; Фактор деления равен 10 lea si, StrNum + 7; Последний символ строки вывода mov ax, Num ; Заносим в ax число mov Negate, 0 ; Флаг отрицательности пока не ; установлен cmp ax, 8000h ; Если старший бит установлен jb d10 ; то число отрицательно neg ax ; Возвращаем к положительной форме mov Negate, 1 ; Устанавливаем флаг отрицательности d10: cmp ax, 10 ; Если частное меньше 10 то ; прекратить цикл jb d20 ; и начать рассмотрение знака cwd ; Иначе расширить знак (для деления) div cx ; И разделить на фактор деления or dl, 30h ; Перевести остаток в ASCII mov [si], dl ; И записать в строку dec si ; Уменьший индекс jmp d10 ; И вернуться на начало цикла d20: or al, 30h ; Перевести частное в ASCII mov [si], al ; И занести в строку cmp Negate, 0 ; Если не был установлен флаг ;отрицательности jz d30 ; То выйти из процедуры dec si ; Иначе еще раз уменьшить индекс mov byte ptr [si], '-' ; И записать в него значок ;минуса d30: pop dx pop cx pop ax ret ; Возврат из процедуры StrCon endp cseg ends end start
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д