Дан вектор 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). Найти количество и сумму нечетных отрицательных элементов вектора»

textual
Листинг программы
%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

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

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