Число нулевых бит - 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 ; нет - рассмотреть следующий
Объяснение кода листинга программы
- mov al, ds:[82h] — Загрузка в AL регистра значения из сегмента данных по адресу 82h.
- cmp al, 0 — Сравнение значения в AL с 0.
- je zero — Если значение в AL равно 0, то переход на метку zero.
- mov cl, 0 - Инициализация счётчика нулей в двоичном представлении числа в AL.
- inc cl — Увеличение счётчика на 1.
- shr al, 1 - Сдвиг двоичного числа в AL вправо на один разряд и проверка правого разряда.
- sbb сl, 0 - Если в правом разряде 1, то уменьшение счётчика на 1.
- cmp al, 0 - Проверка, рассмотрены ли все значащие разряды.
- jnz @@Cycle — Если не все разряды были рассмотрены, то переход на цикл.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д