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

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

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

Дана программа типа .com, с параметром. Посчитать число нулевых бит первого символа нашего параметра. Набросок таков, но где-то закралась ошибка.
text segment 'code'
assume CS:text,SS:text,DS:text,ES:text
org 100h
main proc   
XOR CH,CH        ;CH = 0
MOV CL,DS:[80h]  ;СX = длина

MOV  al,ds:[82h]    ;1 символ параметра
xor bx,bx              
mov cx,8
sub al,30h            ;делаем число
jmp not_zero
 
not_zero:
jcxz loop1  ;если cx=0 ,т.е. сдвинули 8 раз
shr ax,1
jnc zero  ; если вытолкнули 0 в CF 
loop not_zero

zero:
inc bx ; запомнили
dec cx
jmp not_zero
 
loop1:  ;начинаем выводить кол-во нулевых бит
xor ax,ax
mov ax,bx
mov bl,10
div bl
add al,'0'
add ah,'0'
mov str1,ax

MOV AH, 09h      
LEA DX, STR1
INT 21h
JMP exit

exit:
mov AX,4C00h ; завершение
INT 21h ; 
main endp
str1 dw 0Dh,0Ah, 0, '$'; 
text ends
end main
Вопрос ведь даже скорее в том, как считать только значащие нули.

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

textual
Листинг программы
        mov al, ds:[82h]
        cmp al, 0
        je zero ; это какой-то особый случай. а может и нет
 
        mov cl, 0 ; счётчик значащих нулей в двоичном представлении числа в al
@@Cycle:
        inc cl ; увеличиваем счётчик нулей на 1
        shr al, 1 ;проверяем правый разряд
        sbb сl, 0 ; если в правом разряде 1, то уменьшаем счётчик на 1
        cmp al, 0 ; рассмотрены все значащие разряды?
        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