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