Как подсчитать колличество нечетных чисел - Assembler
Формулировка задачи:
data segment mes1 db 'Chyotnix: $' mes2 db 'Nechyotnix: $' mes3 db 10, 13,'$' data ends code segment start: assume cs:code, ds: data mov ax, data mov ds, ax mov cl, 0; cl=0- счетчик четных mov bh, 0;bh=0-сумма нечетных cikl: mov ah, 1; ввод int 21h mov bl, al cmp bl, 13; сравниваем введенный символ с ентер je end_cikl; если не равно, то на ввод следующего числа xor ax, ax; обнулили ax mov dl, 2;dl=2 mov al, bl div dl; делим на dl=2, в ah-остаток al-частное cmp al, 0; сравниваем остаток с 0 je m1; если равно, то переход на m1 add cl, bl; складываем числа нечетные sub cl, 30h; в двоичное jmp cikl m1: inc cl; увеличиваем счетчик jmp cikl end_cikl: mov ah, 09 lea dx, mes3 int 21h lea dx, mes1 int 21h mov ah, bh aam; двоичное в BCD mov cx, ax add cx,3030h; BCD в ASCII mov al, 2 mov dl, ch int 21h mov dl, bh int 21h mov ah, cl aam;двоичное в BCD mov bx, ax add bx, 3030h; BCD в ASCII mov ah, 09 lea dx, mes3 int 21h lea dx, mes2 int 21h mov al, 02 mov dl, cl int 21h mov dl, bl int 21h mov ax,4c00h int 21h code ends end start
Решение задачи: «Как подсчитать колличество нечетных чисел»
textual
Листинг программы
org 100h mov cl, 0; cl=0- счетчик нечетных jmp start cikl: mov ah,al and ah,1 ;У нечётных нулевой бит равен 1 - изолируем его add cl,ah ;И увеличиваем счётчик start: mov ah, 1 ;ввод int 21h cmp al, 13 ;сравниваем введенный символ с ентер jne cikl ;если нажат Enter - выход из цикла mov ah, 09 ;Вывод строки на экран mov dx, mes1 int 21h mov al, cl aam ;двоичное в BCD mov dx,ax add dx,'00' ;BCD в ASCII mov ah, 2 ;Вывод числа на экран rol dx,8 ;Вначале старший разряд int 21h rol dx,8 ;Затем младший int 21h mov ah, 1 ;ввод int 21h ret mes1 db 13,10,'Nechyotnix: $'
Объяснение кода листинга программы
- org 100h — начало выполнения программы, установка точки входа в программу.
- mov cl, 0 — инициализация счётчика нечётных чисел, равная 0.
- jmp start — переход к циклу.
- mov ah,al — перенос значения из регистра al в регистр ah.
- and ah,1 — в данном случае это проверка на чётность вводимого символа (нулевой бит равен 1 для нечётных чисел).
- add cl,ah — увеличение значения счётчика нечётных чисел на значение, равное 1 при нечётном вводе.
- start: — метка начала цикла.
- mov ah, 1 — подготовка к вводу.
- int 21h — ввод с клавиатуры.
- cmp al, 13 — сравнение введённого символа с символом 'Enter' (13).
- jne cikl — если не равно (не нажата клавиша 'Enter'), то продолжается цикл.
- mov ah, 09 — подготовка к выводу строки на экран.
- mov dx, mes1 — в данном случае это адрес строки для вывода.
- int 21h — вывод строки на экран.
- mov al, cl — перенос значения счётчика нечётных чисел в регистр al.
- aam — перевод в BCD.
- mov dx,ax — перенос значения из регистра ax в регистр dx.
- add dx,'00' — добавление строки
00
для преобразования BCD в ASCII. - mov ah, 2 — подготовка к выводу числа на экран.
- rol dx,8 — старший разряд выводимого числа.
- int 21h — вывод числа на экран.
- rol dx,8 — младший разряд выводимого числа.
- int 21h — вывод числа на экран.
- mov ah, 1 — подготовка к вводу.
- int 21h — ввод с клавиатуры.
- ret — завершение программы.
- mes1 db 13,10,'Nechyotnix: $' — строка для вывода на экран (счётчик нечётных чисел).