Число нулевых бит - Assembler

Узнай цену своей работы

Формулировка задачи:

Дана программа типа .com, с параметром. Посчитать число нулевых бит первого символа нашего параметра. Набросок таков, но где-то закралась ошибка.
Листинг программы
  1. text segment 'code'
  2. assume CS:text,SS:text,DS:text,ES:text
  3. org 100h
  4. main proc
  5. XOR CH,CH ;CH = 0
  6. MOV CL,DS:[80h] X = длина
  7.  
  8. MOV al,ds:[82h] ;1 символ параметра
  9. xor bx,bx
  10. mov cx,8
  11. sub al,30h ;делаем число
  12. jmp not_zero
  13. not_zero:
  14. jcxz loop1 ;если cx=0 ,т.е. сдвинули 8 раз
  15. shr ax,1
  16. jnc zero ; если вытолкнули 0 в CF
  17. loop not_zero
  18.  
  19. zero:
  20. inc bx ; запомнили
  21. dec cx
  22. jmp not_zero
  23. loop1: ;начинаем выводить кол-во нулевых бит
  24. xor ax,ax
  25. mov ax,bx
  26. mov bl,10
  27. div bl
  28. add al,'0'
  29. add ah,'0'
  30. mov str1,ax
  31.  
  32. MOV AH, 09h
  33. LEA DX, STR1
  34. INT 21h
  35. JMP exit
  36.  
  37. exit:
  38. mov AX,4C00h ; завершение
  39. INT 21h ;
  40. main endp
  41. str1 dw 0Dh,0Ah, 0, '$';
  42. text ends
  43. end main
Вопрос ведь даже скорее в том, как считать только значащие нули.

Решение задачи: «Число нулевых бит»

textual
Листинг программы
  1.         mov al, ds:[82h]
  2.         cmp al, 0
  3.         je zero ; это какой-то особый случай. а может и нет
  4.  
  5.         mov cl, 0 ; счётчик значащих нулей в двоичном представлении числа в al
  6. @@Cycle:
  7.         inc cl ; увеличиваем счётчик нулей на 1
  8.         shr al, 1 ;проверяем правый разряд
  9.         sbb сl, 0 ; если в правом разряде 1, то уменьшаем счётчик на 1
  10.         cmp al, 0 ; рассмотрены все значащие разряды?
  11.         jnz @@Cycle ; нет - рассмотреть следующий

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

  1. mov al, ds:[82h] — Загрузка в AL регистра значения из сегмента данных по адресу 82h.
  2. cmp al, 0 — Сравнение значения в AL с 0.
  3. je zero — Если значение в AL равно 0, то переход на метку zero.
  4. mov cl, 0 - Инициализация счётчика нулей в двоичном представлении числа в AL.
  5. inc cl — Увеличение счётчика на 1.
  6. shr al, 1 - Сдвиг двоичного числа в AL вправо на один разряд и проверка правого разряда.
  7. sbb сl, 0 - Если в правом разряде 1, то уменьшение счётчика на 1.
  8. cmp al, 0 - Проверка, рассмотрены ли все значащие разряды.
  9. jnz @@Cycle — Если не все разряды были рассмотрены, то переход на цикл.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

14   голосов , оценка 4.571 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут