Подсчитать количество нулевых и ненулевых элементов в заданном векторе - 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в зависимости от результата сравнения. - Определяется момент завершения программы и выводится соответствующее сообщение.