Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2022, 13:28   #1
Qbinik
Пользователь
 
Регистрация: 08.10.2022
Сообщений: 25
По умолчанию Составить блок-схему.

Даны натуральные числа 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
Нужна блок схема к этому коду
Qbinik вне форума Ответить с цитированием
Старый 08.10.2022, 15:26   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1) Вывод: 'N = ' и Ввод: N
2) Цикл i = 0; i < N; i = i + 1
2.1) Вывод 'A(', i, ') = ' и Ввод A[i]
3) Цикл c = 0, i = 0; i < N; i = i + 1
3.1) Условие: A[i] and 1 == 0
3.1.1) Определение: c = c + 1
4) Вывод: 'Kol-vo chetnih elementov: ', c и ввод любой клавиши
5) Выход: код 0 - без ошибок

Подпрограмма str2dw(str)
1) Определение: r = 0
2) Цикл: i = 0; str[i] != 13; i = i + 1
2.1) Условие: str[i] <= '9' or str[i] >= '0'
2.1.1) Определение: r = r * 2 + (str[i] - '0') + r * 8;
3) Выход: возврат r

Подпрограмма: printdec(int)
1) Определение: с = 0, a[5]
2) Цикл с постусловием: int == 0
2.1) Определение: a[c] = int % 10; int = int / 10, c = c + 1
3) Цикл: i = 0; i < c; i = i + 1
3.1) Вывод: a[c - i - 1] + '0'
4) Выход: без результата

Рисуйте сами. Блоки я описал однозначно
Вид блока и слово его обозначающее:
Определение - прямоугольник
Ввод или вывод - параллелограмм
Условие - Ромб
Цикл и цикл с постусловием - Шестиугольник
Вход или выход - Овал (Вход не указывал, он везде под пунктом 0)

Последний раз редактировалось macomics; 09.10.2022 в 15:12.
macomics вне форума Ответить с цитированием
Старый 23.10.2022, 09:43   #3
Qbinik
Пользователь
 
Регистрация: 08.10.2022
Сообщений: 25
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
1) Вывод: 'N = ' и Ввод: N
2) Цикл i = 0; i < N; i = i + 1
2.1) Вывод 'A(', i, ') = ' и Ввод A[i]
3) Цикл c = 0, i = 0; i < N; i = i + 1
3.1) Условие: A[i] and 1 == 0
3.1.1) Определение: c = c + 1
4) Вывод: 'Kol-vo chetnih elementov: ', c и ввод любой клавиши
5) Выход: код 0 - без ошибок

Подпрограмма str2dw(str)
1) Определение: r = 0
2) Цикл: i = 0; str[i] != 13; i = i + 1
2.1) Условие: str[i] <= '9' or str[i] >= '0'
2.1.1) Определение: r = r * 2 + (str[i] - '0') + r * 8;
3) Выход: возврат r

Подпрограмма: printdec(int)
1) Определение: с = 0, a[5]
2) Цикл с постусловием: int == 0
2.1) Определение: a[c] = int % 10; int = int / 10, c = c + 1
3) Цикл: i = 0; i < c; i = i + 1
3.1) Вывод: a[c - i - 1] + '0'
4) Выход: без результата

Рисуйте сами. Блоки я описал однозначно
Вид блока и слово его обозначающее:
Определение - прямоугольник
Ввод или вывод - параллелограмм
Условие - Ромб
Цикл и цикл с постусловием - Шестиугольник
Вход или выход - Овал (Вход не указывал, он везде под пунктом 0)
Спасибо
Qbinik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составить Блок-Схему spani Помощь студентам 2 12.12.2012 22:02
Составить схему алгоритма (блок-схему) doc599 Помощь студентам 12 04.10.2012 17:07
Составить Блок Схему IntelUser Помощь студентам 7 05.03.2011 18:39
Помогите пожалуйста решить две задачи по паскалю и составить и составить блок схему! ...Оленька... Паскаль, Turbo Pascal, PascalABC.NET 2 20.01.2009 09:37