Установить 3 и 0 биты в регистре AL, остальные биты не изменять
or AL, 00001001b.
Сбросить 4 и 6 биты в регистре AL, остальные биты не изменять
and AL, 10101111b.
Проинвертировать 4 и 2 биты в регистре AL, остальные биты не изменять
xor AL, 00010100b.
Перейти на метку LAB, если установлен 4 бит регистра AL, в противном случае продолжить выполнение программы
test AL, 00010000b
jnz LAB
; продолжаем
...
LAB:
Посчитать число единиц в байте – регистре AL
mov CX, 8
xor BX, BX
LL: shl AL, 1
jnc NO
inc BX
NO: loop LL
ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ
Дан массив из 10 байтов. Все байты имеют нулевые старшие биты. Необходимо каждый байт, содержащий 1 в 0-м бите, дополнить до четного числа единиц установкой 7-го бита байта, каждый байт, содержащий 0 в 0-м бите, дополнить до нечетного числа единиц установкой 7-го бита байта.
Текст программы:
model SMALL
stack 100h
dataseg
MB db 04h,07h,11h,23h,04h,38h,3Fh,2Ah,0Dh,34h
codeseg
startupcode
lea BX, MB; BX - текущий адрес массива MB
mov CX, 10; CX - счетчик числа итераций
BEG:
mov AL, [BX]; считать очередной байт массива
test AL, 00000001b; установлен-ли бит 0?
jz BIT0CLR; нет, бит 0 сброшен
|
|
; бит 0 установлен
test AL, 0FFh; четное число единиц?
jp OK; да, больше ничего делать не надо
or AL, 80h; нечетное, дополнить до четного
jmp short OK
BIT0CLR:; бит 0 сброшен
test AL, 0FFh; четное число единиц?
jnp OK; нет, больше ничего делать не нужно
or AL, 80h; четное, дополнить до нечетного
OK:
mov [BX], AL; записать измененный байт массива
inc BX; BX<-адрес очередн. элемента массива
loop BEG
;Конец работы
QUIT: exitcode 0
end
ВАРИАНТЫ ЗАДАНИЙ
1. Дан массив из 10 байтов. Посчитать количество байтов, в которых сброшены 6 и 4 биты.
2. Дан массив из 8 байтов. Рассматривая его как массив из 64 бит, посчитать количество единиц.
3. Дан массив из 8 байтов. Рассматривая его как массив из 64 бит, посчитать длину самой длинной последовательности единиц.
4. Дан массив из 8 байтов. Рассматривая его как массив логических значений x0 x1 x2 x3 x4 x5 x6 x7 (true – есть ненулевые биты в байте, false – все биты нулевые), вычислить логическую формулу f = (x7&~x6&x3&x1) V (x6&x4&x2&x1&~x0) V (~x7&x6&x3&x1).
5. Дан массив из 5 байтов. Рассматривая его как массив из 10 тетрад, найти «исключающее или» всех 10 тетрад.
6. Дан массив из 10 байтов. Посчитать количество байтов, в которых сброшены 5 или 1 биты.
7. Рассматривая байт как набор логических значений x7 x6 x5 x4 x3 x2 x1 x0 (true – 1, false – 0), вычислить логическую формулу f = (x7&~x6&x3&x1) V (x6&x4&x2&x1&~x0) V (~x7&x6&x3&x1).
8. Дан массив из 10 байтов. Посчитать количество байтов, в которых установлены 3 и 7 биты.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. В чем отличие команд test DST, SRC и and DST, SRC?
2. Как сбросить 5-й бит переменной – байта ВВ?
3. Как установить 5-й бит переменной – байта ВВ?
4. Как проинвертировать 5-й бит переменной – байта ВВ?
|
|
5. Как проверить, установлен ли 5-й бит переменной – байта ВВ?
6. Как проверить, четным или нечетным является количество установленных бит в переменной-байте ВВ?
7. Какие флаги условий модифицируются после выполнения команд and, or, xor?
8. В чем основное отличие команд логических и арифметических сдвигов?
9. Укажите максимальное число двоичных разрядов, на которое можно сдвинуть операнд с помощью одной команды сдвига?
10. В паре строк
mov CL, 8
"сдвиг" BL, CL
какие команды можно подставить вместо "сдвиг", чтобы содержимое BL не изменилось?
11. В паре строк
"сдвиг влево" BL, 1
"сдвиг вправо" BL, 1
какие команды можно подставить вместо "сдвиг влево" и "сдвиг вправо", чтобы содержимое BL не изменилось?
Лабораторная работа |
ÑÈÌÂÎËÜÍÀß ÎÁÐÀÁÎÒÊÀ |