Как подсчитать колличество нечетных чисел - 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: $'

Объяснение кода листинга программы

  1. org 100h — начало выполнения программы, установка точки входа в программу.
  2. mov cl, 0 — инициализация счётчика нечётных чисел, равная 0.
  3. jmp start — переход к циклу.
  4. mov ah,al — перенос значения из регистра al в регистр ah.
  5. and ah,1 — в данном случае это проверка на чётность вводимого символа (нулевой бит равен 1 для нечётных чисел).
  6. add cl,ah — увеличение значения счётчика нечётных чисел на значение, равное 1 при нечётном вводе.
  7. start: — метка начала цикла.
  8. mov ah, 1 — подготовка к вводу.
  9. int 21h — ввод с клавиатуры.
  10. cmp al, 13 — сравнение введённого символа с символом 'Enter' (13).
  11. jne cikl — если не равно (не нажата клавиша 'Enter'), то продолжается цикл.
  12. mov ah, 09 — подготовка к выводу строки на экран.
  13. mov dx, mes1 — в данном случае это адрес строки для вывода.
  14. int 21h — вывод строки на экран.
  15. mov al, cl — перенос значения счётчика нечётных чисел в регистр al.
  16. aam — перевод в BCD.
  17. mov dx,ax — перенос значения из регистра ax в регистр dx.
  18. add dx,'00' — добавление строки 00 для преобразования BCD в ASCII.
  19. mov ah, 2 — подготовка к выводу числа на экран.
  20. rol dx,8 — старший разряд выводимого числа.
  21. int 21h — вывод числа на экран.
  22. rol dx,8 — младший разряд выводимого числа.
  23. int 21h — вывод числа на экран.
  24. mov ah, 1 — подготовка к вводу.
  25. int 21h — ввод с клавиатуры.
  26. ret — завершение программы.
  27. mes1 db 13,10,'Nechyotnix: $' — строка для вывода на экран (счётчик нечётных чисел).

Оцени полезность:

15   голосов , оценка 3.8 из 5
Похожие ответы