Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов вектора - Assembler
Формулировка задачи:
Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов вектора
Прошу помочь написать на ТАСМе...Код на Паскале есть:program z8; uses crt; var a:array[1..10] of shortint; i,k,n:byte; s:integer; begin clrscr; randomize; write('Vvedi razmernost massiva='); readln(n); for i:=1 to n do begin a[i]:=random(100--100+1)+-100; write(a[i]:4); if (a[i]<0 )and(odd(a[i])) then begin s:=s+a[i];k:=k+1; end; writeln; writeln('Сумма отрицательных элементов равна ',s); writeln('Кол-во нечётных элементов равно ',k); readkey end.
Решение задачи: «Дан вектор X(x1,x2,.,x10). Найти количество и сумму нечетных отрицательных элементов вектора»
%nolist include mac.lib %list data segment para X dw 10 dup(?) s dw ? ; Cумма элементов k dw 0 ; количество элементов dva dw 2 mes0 db 10,13, 'Zadanie ' mes1 db 10,13, 'Vvedite x[i]=$' mes2 db 10,13, 'Vektor vveden $' mes_err db 10,13, 'Error! Vvodite cifri $' mes3 db 10,13, 'X[10] = $' mes4 db 10,13, 'kolichestvo otricatelnih nech-x elementov = $' mes5 db 10,13, 'summa otricatelnih nech-x elementov= $' data ends stk segment para db 256 dup(?) stk ends code segment para assume ds:data, ss:stk, cs:code vvodmas proc m1: key_$2bin jnc m2 ; проверка является ли введённое число корректным, если ДА, то идём дальше message mes_err ; если НЕТ - требуем повторить ввод jmp m1 ; переходим на метку м1 m2: ret vvodmas endp kol_el proc mov ax, x[di] ; заносим элемент вектора в аккумулятор cmp ax, 0 ; сравниваем c 0 jg m3 ; если не равно, уходим из процедуры cwd idiv dva cmp dx, 0 JE m3 ; иначе inc k ; увеличиваем k на 1 mov ax,x[di] add s,ax ; увеличиваем сумму на x[di] m3: ret ; возвращение в программу kol_el endp print proc mov di, 0 mov cx, 10 printmas: mov ax,[bx]+[di] print_number add di, 2 dec cx cmp cx, 0 je m4 jmp printmas m4: ret print endp start: mov ax, data mov ds, ax ; инициализация ds выполнена message mes0 ; Вывод на экран заголовка mov di, 0 ; задаем первый элемент вектора mov cx, 10 ; задаем количество итераций цикла cycle: mov ah, 9h lea dx, mes1 int 21h ; вывод сообщения call vvodmas ; вызов процедуры ввода элемента вектора mov x[di], ax ; заносим элемент в память add di, 2 ; i: = i + 1 loop cycle ; идем опять в цикл message mes2 crlf message mes3 call print ;mov ah, 9h ;lea dx, mes4 ;int 21h ; вывод сообщения ;key_$2bin ;mov b, ax ; заносим введенное число в b mov di, 0 ; переходим к первому элементу вектора mov s, di ; обнулили сумму mov cx, 10 ; задали значение счетчика циклов cycle2: call kol_el add di, 2 ; выбираем следующий элемент вектора loop cycle2 ; возвращаемся в цикл message mes4 mov ax, k print_number message mes5 mov ax, s print_number inkey mov ax, 4C00h int 21h code ends end start
Объяснение кода листинга программы
%nolist include mac.lib %list 1: data segment para X dw 10 dup(?) s dw ? k dw 0 dva dw 2 mes0 db 10,13, 'Zadanie ' mes1 db 10,13, 'Vvedite x[i]=$' mes2 db 10,13, 'Vektor vveden $' meserr db 10,13, 'Error! Vvodite cifri $' mes3 db 10,13, 'X[10] = $' mes4 db 10,13, 'kolichestvo otricatelnih nech-x elementov = $' mes5 db 10,13, 'summa otricatelnih nech-x elementov= $' data ends 2: stk segment para db 256 dup(?) stk ends 3: code segment para assume ds:data, ss:stk, cs:code 4: vvodmas proc m1: key$2bin 5: jnc m2 6: message mes_err 7: jmp m1 m2: ret vvodmas endp 8: kol_el proc 9: mov ax, x[di] 10: cmp ax, 0 11: jg m3 12: cwd 13: idiv dva 14: cmp dx, 0 15: JE m3 16: inc k 17: mov ax,x[di] 18: add s,ax m3: ret kol_el endp 19: print proc 20: mov di, 0 21: mov cx, 10 printmas: mov ax,[bx]+[di] 22: print_number 23: add di, 2 24: dec cx 25: cmp cx, 0 26: je m4 27: jmp printmas m4: ret print endp 28: start: mov ax, data 29: mov ds, ax 30: message mes0 31: mov di, 0 32: mov cx, 10 33: cycle: mov ah, 9h 34: lea dx, mes1 35: int 21h 36: call vvodmas 37: mov x[di], ax 38: add di, 2 39: loop cycle 40: message mes2 41: crlf 42: message mes3 43: call print 44: message mes4 45: mov ax, k 46: print_number 47: message mes5 48: mov ax, s 49: print_number 50: inkey 51: mov ax, 4C00h 52: int 21h code ends end start %list
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д