Подсчитать количество нулевых и ненулевых элементов в заданном векторе - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, не могу разобраться, как вводить знаковые числа в массив.Само задание такое: Подсчитать количество нулевых и ненулевых элементов в заданном векторе и определить, каких элементов в векторе больше а) элементы вектора однобайтовые; б) элементы вектора двухбайтовые. Вот, что получилось для двухбайтового массива
.model small
.stack 100h
.data
Mas dw 10 dup (?)
len dw 10
Sch_0 dw 0 ;счетчик нулевых элементов вектора
Sch_otr dw 0
msg_z db "Null"
msg_o db "Otr"
msg_ravn db "Ravny"
.code
InputInt proc 
 
    mov ah,0ah
    xor di,di
    mov dx,offset buff ; аддрес буфера
    int 21h ; принимаем строку
    mov dl,0ah
    mov ah,02
    int 21h ; выводим перевода строки
    
; обрабатываем содержимое буфера
    mov si,offset buff+2 ; берем аддрес начала строки
    cmp byte ptr [si],"-" ; если первый символ минус
     jnz ii1
    mov di,1  ; устанавливаем флаг
    inc si    ; и пропускаем его
ii1:
    xor ax,ax
    mov bx,10  ; основание сc
ii2:
    mov cl,[si] ; берем символ из буфера
    cmp cl,0dh  ; проверяем не последний ли он
    jz endin
    
; если символ не последний, то проверяем его на правильность
    cmp cl,'0'  ; если введен неверный символ <0
    jb er
    cmp cl,'9'  ; если введен неверный символ >9
    ja er
 
    sub cl,'0' ; делаем из символа число 
    mul bx     ; умножаем на 10
    add ax,cx  ; прибавляем к остальным
    inc si     ; указатель на следующий символ
    jmp ii2     ; повторяем
 
er:   ; если была ошибка, то выводим сообщение об этом и выходим
    mov dx, offset error
    mov ah,09
    int 21h
    int 20h
 
; все символы из буфера обработаны число находится в ax
endin:
    cmp di,1 ; если установлен флаг, то
    jnz ii3
    neg ax   ; делаем число отрицательным
ii3:
    ret
 
error db "incorrect number$"
buff    db 6,7 Dup(?)
InputInt endp
 
main proc
Mov cx, len ;инициализация счетчика цикла
Xor si,si ;инициализация индексного регистра
Cyc:call InputInt
mov mas[si],ax
inc si
dec cx
jz dal
jmp cyc
dal:Mov cx, len ;инициализация счетчика цикла
mov si,0
Xor si,si ;инициализация индексного регистра
Cycl: cmp mas[si],0 ;сравниваем элемент вектора с 0
Jz zero ;нуль-элементы считаем в блоке zero
Inc Sch_otr ;увеличиваем счетчик элементов <0
Jmp kon_cycl
Zero: Inc Sch_0 ;увеличиваем счетчик нулевых элементов
kon_cycl: inc si ;
loop cycl
mov ax, sch_otr
mov bx, sch_0
cmp ax,bx
jz ravn
Jg pol
mov ax,@data
    mov ds,ax
    mov ah,9
    mov dx,OFFSET msg_z
    int 21h
    mov ah,4ch
    int 21h
jmp konec
pol: mov ax,@data
    mov ds,ax
    mov ah,9
    mov dx,OFFSET msg_o
    int 21h
    mov ah,4ch
    int 21h
jmp konec
ravn: mov ax,@data
    mov ds,ax
    mov ah,9
    mov dx,OFFSET msg_ravn
    int 21h
    mov ah,4ch
    int 21h
konec: nop
main endp
end main

Решение задачи: «Подсчитать количество нулевых и ненулевых элементов в заданном векторе»

textual
Листинг программы
.model small
.stack 100h
.data
 
Mas dw 10 dup (?)
Sch_0 dw 0 ;счетчик нулевых элементов вектора
Sch_otr dw 0
 
msg_z db "Null", 13,10,'$' 
msg_o db "Otr", 13,10,'$'
 
.code
jmp main
InputInt proc 
    mov ah,0ah
    xor di,di
    mov dx,offset buff ; аддрес буфера
    int 21h ; принимаем строку
    mov dl,0ah
    mov ah,02
    int 21h ; выводим перевода строки
    
; обрабатываем содержимое буфера
    mov si,offset buff+2 ; берем аддрес начала строки
    cmp byte ptr [si],"-" ; если первый символ минус
    jnz ii1
    mov di,1  ; устанавливаем флаг
    inc si    ; и пропускаем его
ii1:
    xor ax,ax
    mov bx,10  ; основание сc
ii2:
    mov cl,[si] ; берем символ из буфера
    cmp cl,0dh  ; проверяем не последний ли он
    jz endin
 
    sub cl,'0' ; делаем из символа число 
    mul bx     ; умножаем на 10
    add ax,cx  ; прибавляем к остальным
    inc si     ; указатель на следующий символ
    jmp ii2     ; повторяем
 
; все символы из буфера обработаны число находится в ax
endin:
    cmp di,1 ; если установлен флаг, то
    jnz ii3
    neg ax   ; делаем число отрицательным
ii3:
    ret
 
buff    db 6,7 Dup(?)
InputInt endp
 
main:
mov ax, @data
mov ds, ax
xor ax,ax
Xor si,si ;инициализация индексного регистра
Mov cx, 10 ;инициализация счетчика цикла
 
cycl1:
push cx
call InputInt
mov mas[si], ax
inc si
pop cx
loop cycl1
 
xor ax,ax
Mov cx, 10 ;инициализация счетчика цикла
Xor si,si ;инициализация индексного регистра
 
Cycl: cmp mas[si],0 ;сравниваем элемент вектора с 0
Jz zero ;нуль-элементы считаем в блоке zero
jl otr
jmp kon_cycl
otr:Inc Sch_otr ;увеличиваем счетчик элементов <0
Jmp kon_cycl
Zero: Inc Sch_0 ;увеличиваем счетчик нулевых элементов
kon_cycl: inc si ;переходим к следующему элементу
;вектора
loop cycl
 
mov bx, sch_0
mov ax, sch_otr
cmp ax,bx
Jg otrb
mov ax,@data
    mov ds,ax
    mov ah,9
mov dx,OFFSET msg_z
    int 21h
    mov ah,4ch
    int 21h
jmp konec
otrb:
mov ax,@data 
    mov ds,ax
    mov ah,9
mov dx,OFFSET msg_o
    int 21h
    mov ah,4ch
    int 21h
konec:
end main

Объяснение кода листинга программы

  1. Объявляются переменные и задается текстовое сообщение msg_z для вывода Null и msg_o для вывода Otr.
  2. Описывается процедура InputInt, которая считывает числа из ввода пользователя.
  3. Инициализируется массив Mas и переменные Sch_0 (счетчик нулевых элементов вектора) и Sch_otr (счетчик отрицательных элементов вектора).
  4. Создается цикл для считывания 10 чисел и помещения их в массив Mas.
  5. Создается цикл для подсчета количества нулевых и отрицательных элементов вектора. В случае, если элемент равен 0, увеличивается Sch_0; если элемент меньше 0, увеличивается Sch_otr. После этого происходит вывод сообщения Null или Otr в зависимости от результата сравнения.
  6. Определяется момент завершения программы и выводится соответствующее сообщение.

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

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