Главная страница

Исследование работы команд операций над битами и логических команд микропроцессора. лабораторная работа. "Исследование работы команд операций над битами и логических команд микропроцессора"


Скачать 389.15 Kb.
Название"Исследование работы команд операций над битами и логических команд микропроцессора"
АнкорИсследование работы команд операций над битами и логических команд микропроцессора
Дата30.11.2022
Размер389.15 Kb.
Формат файлаdocx
Имя файлалабораторная работа.docx
ТипЛабораторная работа
#821938

ФГБОУ ВО Кубанский государственный технологический университет (Куб ГТУ)

Армавирский механико-технологический институт

Кафедра внутризаводского электрооборудования и автоматики


ЛАБОРАТОРНАЯ РАБОТА
По дисциплине: Низкоуровневые языки программирования.

На тему: "Исследование работы команд операций над битами и логических команд микропроцессора".


Студент: ------

(фамилия, имя, отчество)

Группа: -------

(шифр группы)

Вариант: нет

(номер варианта)

Преподаватель: --------

(фамилия, инициалы


Армавир

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 бит исходного числа.

Вывод: Изучил группы команд микропроцессора относящихся к командам операций над битами и логическим командам. Исследовал работу команд операций над битами и логических команд.
Выполнил студент ___________________ ___________________

(дата) (подпись)

Проверил преподаватель ______________ __________________

(дата) (подпись)


написать администратору сайта