Подсчитать количество нулевых и ненулевых элементов в заданном векторе - 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
Объяснение кода листинга программы
- Объявляются переменные и задается текстовое сообщение
msg_z
для выводаNull
иmsg_o
для выводаOtr
. - Описывается процедура
InputInt
, которая считывает числа из ввода пользователя. - Инициализируется массив
Mas
и переменныеSch_0
(счетчик нулевых элементов вектора) иSch_otr
(счетчик отрицательных элементов вектора). - Создается цикл для считывания 10 чисел и помещения их в массив
Mas
. - Создается цикл для подсчета количества нулевых и отрицательных элементов вектора. В случае, если элемент равен 0, увеличивается
Sch_0
; если элемент меньше 0, увеличиваетсяSch_otr
. После этого происходит вывод сообщенияNull
илиOtr
в зависимости от результата сравнения. - Определяется момент завершения программы и выводится соответствующее сообщение.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д