Пример 5. Посчитать число единиц в регистре al, рассматривая байт, как набор бит.
Mov cx, b ; число сдвигов
Xor bl, bl ; обнуление BL
LL: shl al, 1 ; сдвиг влево на один разряд
Jnc NO ; переход, если нет переноса
Inc bl ; иначе увеличить BL
NO: loop LL ; возврат, если cx ¹0
Пример выполнения работы
Дан массив из 10 байт. Все байты имеют нулевые старшие биты. Необходимо каждый байт, содержащий единицу в нулевом бите, дополнить до четного числа единиц установкой седьмого бита. Текст решения представлен в листинге 4.1.
Листинг 4.1. Решение
Data segment
NB db 04h, 07h, 14h, 23h, 04h,38h, 3Fh, 2Ah0Dh, 34h
Data ends
Code segment
Assume cs: code. ds:data
START: mov ax, data
Mov ds, ax ; Загрузить сегментный адрес данных
Lea bx, NB ; bx-текущий адрес массива NB
Mov cx, 10 ; cx-счетчик числа интераций
BEG: mov al, [bx] ; считать очередной байт массива
Test al, 1b ; установлен ли бит 0?
Jz BITOCLR ; нет, бит 0 сброшен
; бит 0 установлен
Test al, 0ffh ; четное число единиц?
Jp OK ; да, больше ничего делать не надо
Or al, 80h ; нечетное дополнить до четного?
Jmp short OK
; бит 0 сброшен
BITOCLR: test al, 0ffh ; четное число единиц?
Jnp OK ; нет, больше ничего делать не нужно
Or al,80h ; нечетное, дополнить до нечетного
OK: mov [bx], al ; записать измененный байт массива