Исследование работы команд операций над битами и логических команд микропроцессора. лабораторная работа. "Исследование работы команд операций над битами и логических команд микропроцессора"
![]()
|
ФГБОУ ВО Кубанский государственный технологический университет (Куб ГТУ) Армавирский механико-технологический институт Кафедра внутризаводского электрооборудования и автоматики ЛАБОРАТОРНАЯ РАБОТА По дисциплине: Низкоуровневые языки программирования. На тему: "Исследование работы команд операций над битами и логических команд микропроцессора". Студент: ------ (фамилия, имя, отчество) Группа: ------- (шифр группы) Вариант: нет (номер варианта) Преподаватель: -------- (фамилия, инициалы Армавир 2022 Цель работы: Ознакомиться с группой команд микропроцессора относящихся к командам операций над битами и логическим командам. Исследование работы команд операций над битами и логических команд. Задание: Выполнить логические команды и команды работы с битами. Объясните назначение команд и укажите состояние регистров и ячеек памяти до начала выполнения команд и после. Использовать свои варианты работы с произвольными операндами. Ход решения Разработаю программу для исследования работы логических команд and, or, xor, test, not. Для этого буду осуществлять различные операции над числами и смотреть на изменения в битах чисел и состояние флагов. Возьму произвольное двоичное число, например 01110011b = 73h и произведу над ним различные операции. Выполню установку старшего и младшего бита числа в 1, используя маску 10000001b = 81h. Для этого использую команду or al, 10000001b. Старший бит равен 0, он должен изменить значение на 1, младший бит равен 1, его значение должно остаться неизменным. В результате в регистре al должно находиться число 11110011b = f3. Выполню сброс в регистре al 6, 4 и 3 битов в 0. Для этого использую маску 10100111b = a7h командой and al, 10100111b. В регистре al находится число 11110011b = f36, 6 и 4 биты равны 1, их значение должно измениться на 0, 3 бит равен 0, его значение должно остаться неизменным. В результате в регистре al я должен получить число 10100011b = a3h. Инвертирую в регистре al, содержащем число 10100011b = a3h три младших бита, нулевой, первый и второй, командой xor al, 00000111b. В результате я должен получить в регистре al число 10100100b = a4h. Проверяю состояние старшего бита в регистре al командой test al, 10000000b. В результате в регистре al число не должно измениться 10100100b = a4h, zf = 1, так как единичный бит в маске и в проверяемом числе совпали. Исследую работу команды not al, которая инвертирует значение операнда. В результате я должен получить в al значение 01011011b = 58h. Листинг разработанной программы приведен ниже: Листинг 1 .486 model small stack 256 .data .code main: mov ax, @data mov ds, ax xor ax, ax mov al, 01110011b or al, 10000001b ;установка битов в 1 согласно маски and al, 10100111b ;сброс битов в 0 согласно маски xor al, 00000111b ;инвертирую биты согласно маски test al, 10000000b ;проверяю бит согласно маски ;если равен 1, zf = 0 ;если равен 0, zf = 1 not al ;инвертирую регистр al exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы Выполняю компиляцию программы и запускаю ее в отладчике Turbo Debugger (рисунок 1). ![]() Рисунок 1 – Пошаговое выполнение программы 7.exe Выполняю программу пошагово для исследования работы логических команд. После выполнения команды or в регистре al находится число 11110011b = f3, то есть я установил старший бит регистра al в 1 (рисунок 2). ![]() Рисунок 2 – Состояние программы после выполнения команды or Выполняю команду and с целью сброса в регистре al 6, 4 и 3 битов в 0. В регистре al находится число 11110011b = f36, 6 и 4 биты равны 1, их значение должно измениться на 0, 3 бит равен 0, его значение должно остаться неизменным. В результате в регистре al я получил число 10100011b = a3h (рисунок 3). ![]() Рисунок 3 – Состояние программы после выполнения команды and ![]() Рисунок 4 – Состояние программы после выполнения команды xor Выполняю команду xor. При этом в регистре al, содержащем число 10100011b = a3h три младших бита, нулевой, первый и второй должны быть инвертированы. В результате я получаю в регистре al число 10100100b = a4h (рисунок 4). Выполняю команду test с целью проверки состояния старшего бита в регистре al. В результате в регистре al число не изменилось 10100100b = a4h, zf = 0, так как единичный бит в маске и в проверяемом числе совпали (рисунок 5). ![]() Рисунок 5 – Состояние программы после выполнения команды test Исследую работу команды not al, которая инвертирует значение операнда al = 10100100b. В результате я получаю в al значение 01011011b = 5bh (рисунок 6). ![]() Рисунок 6 – Состояние программы после выполнения команды not Разрабатываю программу для исследования работы команд поиска первого установленного в 1 бита операнда bsf и bsr. Для этого в регистр ax запишем число 0000 0000 1000 1000b и произведем поиск первого установленного в 1 бита оператора. Результат будем записывать в регистр bx. Для поиска буду использовать следующие команды: bsf bl, ax сканирует от младшего бита к старшему, ожидаемый результат 3 bsr bl, ax сканирует от старшего бита к младшему, ожидаемый результат 7 bsf bh, ah сканирует от младшего бита к старшему, но так как перед этим ax будет установлен в 0, то ожидаемый результат установка флага zf = 1 Листинг 2 .486 model small stack 256 .data .code main: mov ax, 10001000b mov bx, 0 bsf bx, ax ;сканирует от младшего бита к старшему, ;ожидаемый результат 3 bsr bx, ax ; сканирует от старшего бита к младшему, ;ожидаемый результат 7 xor ax, ax bsf bx, ax ;сканирует от младшего бита к старшему, ;но так как сканируется ax = 0, ;то ожидаемый результат установка флага zf = 1 exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы Компилирую программу и выполняю ее пошагово в среде Turbo Debugger. Выполняю пошагово и исследую работу команд. Команда bsf bx, ax в регистр bx помещает значение 3, что соответствует планируемому результату работы (рисунок 7). Так же результат команды bsr bx, ax ожидаемому результату. ![]() Рисунок 7 – Состояние программы после выполнения команды bsf bx, ax ![]() Рисунок 8 – Состояние программы после выполнения команды bsf bx, ax После обнуления регистра ax командой xor ax, ax произвожу повторный поиск командой bsf bx, ax. Получаю ожидаемый результат, флаг zf = 1 (рисунок 8). Разрабатываю программу для исследования работы команд операций над битами, команд сдвига и циклического сдвига. Для этого использую команду bt ax, 7, которая проверяет, 7 бит в регистре ах (в числе 10001000b). В результате работы команды флаг cf должен быть установлен в 1. Следующая команда btc ax, 6 проверяет 6 бит числа в регистре ах (в числе 10001000b), устанавливает флаг cf = 0 в соответствии со значением этого бита и затем инвертирует этот бит. В результате в регистре ах должно находиться число 11001000b = c8h. Исследование работы команд сдвига проведу с помощью команды shl ax, 2 которая осуществит логический сдвиг битов в операнде ах (числа 10001011b) влево, справа будут вписаны 0, в сf = 0 будет записан последний сдвинутый бит. Исследование команд циклического сдвига выполню с помощью команды rcl ax, 3, которая выполнит циклический сдвиг влево числа в регистре ах (1111000011110000b) через флаг переноса. В результате в регистре ах должно быть число 1000011110000011b = 8783b, а флаг переноса cf = 1. Листинг программы приведен ниже, как листинг 3. Листинг 3 .486 model small stack 256 .code main: mov ax, 10001000b nop bt ax, 7 ;проверить значение бита 7 jc m1 ;переход, если бит равен 1 nop m1: btc ax, 6 ;проверить значение бита 6 и инвертировать его jc m2 ;переход, если бит равен 1 nop m2: mov ax, 10001011b shl ax, 2 ;произвожу логический сдвиг оператора ах влево ;на 2 позиции, справа дописываются 0 mov ax, 1111000011110000b rcl ax, 3 ;произвожу циклический сдвиг влево, ;включая флаг переноса exit: mov ax,4c00h ;стандартный выход int 21h end main ;конец программы Компилирую программу и выполняю ее пошаговую отладку в программе Turbo Debugger. Исследую работу команды bt ax, 7 и вижу, что состояние регистра ах не изменено, флаг cf = 1 (рисунок 9). Исследую работу команды btc ax, 6 (рисунок 10). Я вижу, что после выполнения команды состояние регистра cf = 0, что говорит о том, что 6 бит в регистре ах был равен 0, а значение в регистре ах = c8h, говорит о том, что состояние 6 бита инвертировано в 1. ![]() Рисунок 9 – Состояние программы после выполнения команды bt ax, 7 ![]() Рисунок 10 – Состояние программы после выполнения команды btc ax, 6 Исследую работу команды shl ax, 2. После выполнения данной команды в отладчике я вижу, что значение регистра ах изменилось с 10001011b = 8bh на 22с, что означает число 0010 0010 1100b. Я вижу что произошло смещение влево на 2 разряда. Справа дописаны 0. Регистр cf = 0, так как в старших разрядах регистра ах находились 0 и последний сдвинутый байт был равен 0 (рисунок 11). ![]() Рисунок 11 – Состояние программы после выполнения команды shl ax, 2 ![]() Рисунок 12 – Состояние программы после выполнения команды rcl ax, 3 Исследую команды циклического сдвига, используя команду rcl ax, 3. Перед выполнением команды в регистр ах записываю число 1111000011110000b = 0f0f0h. Далее команда выполняет циклический сдвиг числа влево через флаг переноса. В результате я вижу, что в регистре ах записано число 8783h, что соответствует двоичному числу 1000 0111 1000 0011b. Флаг переноса cf = 1. Я вижу, что в регистре ах произошел сдвиг влево на 3 бита, 3бита справа заполнены чилами: второй бит равен 0, поступившим из флага переноса, первый и нулевой бит равны 1, то есть получили значения из 14 и 15 бит исходного числа, флаг переноса равен 1, в него записан 13 бит исходного числа. Вывод: Изучил группы команд микропроцессора относящихся к командам операций над битами и логическим командам. Исследовал работу команд операций над битами и логических команд. Выполнил студент ___________________ ___________________ (дата) (подпись) Проверил преподаватель ______________ __________________ (дата) (подпись) |