Построить Блок-схему TASM
Даны натуральные числа n, a1....an. Определить количество членов ak последовательности a1,....,an, являющихся четными числами.
.model small
.data
N dw 0 ;размер массива
A dw 100 dup (0)
msg1 db 'N = $'
msg2 db 13,10,'Kol-vo chetnih elementov: $'
buf db 8,10 dup(0) ;принимает строку, введенную с клавиатуры
str0 db 0dh,0ah,'A($';формируемая для вывода строка
str1 db ')= $'
.stack 256
.code
start:
mov ax,@data ;Настраиваем сегментные регистры
mov ds,ax
m1: mov ah,9 ;функция вывода сообщения на экран
lea dx,msg1 ;выводимое сообщение
int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
int 21h ;пользователь вводит в текстовом виде в buf значение числа
lea si,buf[2] ;начало введенного текста
call str2dw ;преобразовываем строку в значение
test ax,ax ;если 0 или ошибка
jz m1 ;повторить ввод
mov N,ax ;сохранить размер массива
lea bx,A ;начало массива
mov cx,0 ;номер элемента(начинаем с 0)
inpmas: mov ah,9 ;функция вывода сообщения на экран
lea dx,str0 ;(
int 21h ;выводим на экран
mov ax,cx ;номер элемента
call printdec ;преобразуем номер элемента в строку и выводим на экран
mov ah,9 ;функция вывода сообщения на экран
lea dx,str1 ;)=
int 21h ;выводим на экран
mov ah,0ah ;функция ввода строки с клавиатуры
mov dx,offset buf ;буфер куда вводить
int 21h ;пользователь вводит в текстовом виде в buf значение элемента массива
lea si,buf[2] ;начало введенного текста
call str2dw ;преобразовываем строку в значение
mov [bx],ax ;заносим значение в массив
add bx,2 ;следующий элемент
inc cx ;номер следующего элемента
cmp cx,N ;если не равен N
jnz inpmas ;то продолжить
;Определить количество членов ak последовательности a1,....,an, являющихся четными числами.
xor bp,bp ;кол-во четных элементов=0
mov cx,N ;размер массива
lea bx,A ;начало массива
lp: mov ax,[bx] ;взять очередной элемент
test ax,1 ;проверить четность
jnp m2 ;если нечетный, пропустить
inc bp ;если четный, увеличить кол-во найденных
m2: add bx,2 ;следующий элемент массива
loop lp ;обработать весь массив
mov ah,9 ;функция вывода сообщения на экран
lea dx,msg2 ;выводимое сообщение
int 21h ;выводим на экран
mov ax,bp ;кол-во найденных элементов
call printdec ;вывести на экран.
mov ah,1 ;Ожидаем нажатия любой клавиши
int 21h
mov ax,4c00h ;закончить программу
int 21h
str2dw proc
;Преобразование строки в число
;на входе ds:si ссылается на ASCII строку, которую нужно преобразовать
;на выходе в ax - число.
push dx ;сохраняем регистры "сохранить регистры" значит все строки выполняют это действие
push si
xor dx,dx ;сумма
@lp1: xor //ax,ax
lodsb ;берем символ
cmp al,13 ;если это конец строки,
jz @ex ;то заканчиваем
cmp al,'9' ;если это не цифра,
jnbe @lp1 ;то пропускаем
cmp al,'0' ;если это не цифра,
jb @lp1 ;то пропускаем
sub ax,'0' ;получаем цифровое значение
shl dx,1 ;умножаем сумму на 10
add ax, dx
shl dx, 2
add dx, ax ;прибавляем текущее значение
jmp @lp1 ;продолжаем обработку
@ex: mov ax,dx ;помещаем результат в ах
pop si ;восстанавливаем регистры
pop dx
ret ;выход их подпрограммы
str2dw endp
;преобразование числа из ах в десятичную строку и вывод на экран
;ax - число
printdec proc
push cx ;сохраняем регистры
push dx
push bx
mov bx,10 ;основание системы
xor cx,cx ;в сх будет количество цифр в десятичном числе
@@m1a: xor dx,dx ;очистить старшую часть делимого
div bx ;делим число на степени 10
push dx ;и сохраняем остаток от деления(коэффициенты при степенях) в стек
inc cx ;увеличиваем количество десятичных цифр числа
test ax,ax ;после деления остался 0?
jnz @@m1a ;если нет, продолжаем
mov ah,2 ;ф-я вывода символа
@@m2a: pop dx ;взять из стека цифру цисла
add dl,'0' ;преобразовываем цифру в ASCII символ
int 21h ;вывести на экран
loop @@m2a ;все цифры
pop bx ;восстанавливаем регистры
pop dx
pop cx
ret ;выход из подпрограммы
printdec endp
end start
Нужна блок схема к этому коду