Примеры использования логических команд

Установить 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 не изменилось?


Лабораторная работа

ÑÈÌÂÎËÜÍÀß ÎÁÐÀÁÎÒÊÀ


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: