|
Применение логических инструкцийЛогические команды служат для сброса или установки отдельных бит в байте или слове. Они включают булевы операторы НЕ, И, ИЛИ, исключающее ИЛИ и операцию тестирования, которая устанавливает флаги, но не изменяет значения своих операндов. Логические инструкции not dst Инструкция not инвертирует все биты байта или слова. and dst, src Инструкция and выполняет операции логическое И двух операндов (байтов или слов) и возвращает результат в операнд-приемник. Бит результата устанавливается в 1, если установлены в 1 оба соответствующих ему бита операндов, и устанавливаются в 0 противном случае. or dst, src Инструкция or выполняет операции логическое ИЛИ двух операторов (байтов или слов) и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если равен 1 хотя бы один из двух соответствующих ему битов операндов и устанавливается в 0 в противном случае. xor dst, src Инструкция xor выполняет операцию логическое исключающее ИЛИ двух операндов и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если соответствующие ему биты операндов имеют противоположные значения, и устанавливается в 0 в противном случае. test dst, src Инструкция test выполняет логическое И двух операндов (байтов или слов), модифицирует флаги, но результат не возвращает, т.е. операнды не изменяются. В таблице 4.1. приведены значения регистра флагов, устанавливаемые логическими командами.
Примеры использования логических команд 1. Установить 3 и 0 биты в регистре аl, остальные биты не изменять. or al, 00001001b 2. Сбросить 4 и 6 битвы в регистре al, остальные биты не изменять. and al, 10101111b 3. Инвертировать 2 и 4 биты в регистре al, остальные биты не изменять. xor al, 00010100b 4. Перейти на метку LAB, если установлен 4 бит регистра al, в противном случае продолжить выполнение программы. test al, 00010000b jnz LAB продолжаем ... LAB: 5. Посчитать число единиц в регистре al, рассматривая байт, как набор бит. mov cx, b; число сдвигов xor bl, bl; обнуление BL LL: shl al, 1; сдвиг влево на один разряд jnc NO; переход, если нет переноса inc bl; иначе увеличить BL NO: loop LL; возврат, если cx ¹0 Пример выполнения работы Дан массив из 10 байт. Все байты имеют нулевые старшие биты. Необходимо каждый байт содержащий единицу в нулевом бите дополнить до четного числа единиц установкой седьмого бита. Текст программы: 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; записать измененный байт массива loop BEG QUIT: mov ax, 4c00h; Код завершения 0 Int 21h; Выход в DOS code ends end START Варианты заданий 1. Дан массив из 10 байт. Посчитать количество байт, в которых сброшены 6 и 4 биты. 2. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество единиц. 3. Дан массив из 8 байт. Рассматривая его как массив логических значений х0 х1 х2 х3 х4 х5 х6 х7 (true-есть ненулевые биты в байте, false-все биты нулевые), вычислить логическую формулу f=(x7 & x6 & x1) V (x6 & x4 & x2 & x1 & x0) V (x7 & x6 & x3 & x1). 4. Дан массив из 10 байт. Посчитать количество байт с числом единиц в байте равным три. 5. Рассматривая байт как набор логических значений x7 x6 x5 x4 x3 x1 x0 (true -1, false - 0), вычислить логическую формулу f=(x7 & x6 & x3) V (x6 & x4 & x2 & x1) V (x7 & x6 & x2 & x0) 6. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит посчитать длину самой длинной последовательности единиц. 7. Дан массив из 10 байт. Посчитать количество единиц во всех разрядах, кратных трём: 3, 6, 9, …, 75, 78. 8. Дан массив из 5 байт. Рассматривая его как массив из 8 пятиразрядных слов, найти “исключающее или” всех 8 слов для выражения “10101”. 9. Дан массив из 6 байт. Рассматривая его, как массив из 48 бит, посчитать в нём количество нулей. 10. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль. 11. Дан массив из 7 байт. Рассматривая его, как массив из восьми семибитных слов, посчитать количество слов с нечетным числом нулей в слове. 12. Дан массив из 9 байт. Рассматривая его как массив из 72 бит, посчитать число переходов между нулями и единицами. 13. Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль. 14. Дан массив из 6 байт. Посчитать количество байт число единиц, в которых не превышает 3. 15. Дан массив из 11 байт. Посчитать количество байт, в которых нет единиц, стоящих рядом. 16. Дан массив из 4 байт. Рассматривая его, как массив из 32 бит посчитать длину самой длинной последовательности нулей. 17. Дан массив из 6 байт. Посчитать количество единиц во всех разрядах, кратных пяти: 5, 10, …, 45. 18. Дан массив из 3 байт. Рассматривая его как массив из 8 трёхразрядных слов, найти “исключающее или” всех 8 слов для выражения “101”. 19. Дан массив из 7 байт. Рассматривая его, как массив из 56 бит, посчитать в нём количество нулей, стоящих после единицы. Конец последовательности рассматривать как нуль. 20. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество пар единиц в окружении нулей. Конец последовательности рассматривать как нуль. 21. Дан массив из 5 байт. Рассматривая его, как массив из восьми пятибитных слов, посчитать количество слов с чётным числом единиц в слове. 22. Дан массив из 6 байт. Рассматривая его, как массив из 48 бит, посчитать число двух единиц, стоящих между нулями. Конец и начало последовательности рассматривать как нули. 23. Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль. 24. Дан массив из 6 байт. Посчитать количество байт, число единиц в которых не превышает 3. 25. Дан массив из 11 байт. Посчитать количество байт, в которых нет единиц, стоящих рядом. Вопросы по теме 1. В чем отличие команд test и and? 2. Как сбросить 5-й бит переменной байта ВВ? 3. Как установить 5-й бит переменной байта ВВ? 4. Как инвертировать 5-й бит переменной байта ВВ? 5. Как проверить установлен ли 5-й бит переменной байта ВВ? 6. Как проверить четным или нечетным является количество установленных бит в байте? 7. Какие флаги условий модифицируются после выполнения команд and, or, xor? 8. В чем основное отличие команд логических и арифметических сдвигов? 9. Укажите максимальное число двоичных разрядов, на которые можно сдвинуть операнд с помощью одной команды сдвига? ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|