Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
128.17 Кб
Скачать

1.2. Битовые операции в языке Ассемблер.

Логические операции с битами-OR, XOR, NOT, AND.Эти команды работают с приемником и источником, исключение команды ‘NOT’. Каждый бит в приемнике сравнивается с тем же самым битом в источнике, и в зависимости от команды 0 и 1 помещается в бит приемник:

Команда

AND

OR

XOR

NOT

Бит источника

0

0

1

1

0

0

1

1

0

0

1

1

0

1

Бит приемника

0

1

0

1

0

1

0

1

0

1

0

1

X

X

Бит результата

0

0

0

1

0

1

1

1

0

1

1

0

1

0

Для выполнения операции логического И предназначена команда AND. У этой команды 2 операнда, результат помещается на место первого операнда. Часто эта команда используется для обнуления определённых битов числа. При этом второй операнд называют маской. Обнуляются те биты операнда, которые в маске равны 0, значения остальных битов сохраняются. Логическое ИЛИ вычисляется с помощью команды OR. У этой команды тоже 2 операнда и результат помещается на место первого. Часто эта команда используется для установки в 1 определённых битов числа. Если бит маски равен 1, то бит результата будет равен 1, остальные биты сохранят свои значения.

Обозначение операции в комментарии к первой строке используется во многих языках высокого уровня. Часто XOR используется для обнуления регистров. Если операнды равны, то результат операции равен 0. Такой способ обнуления работает быстрее и, в отличии от команды MOV, не содержит непосредственного операнда, поэтому команда получается короче (и не содержит нулевых байтов).

Каждый бит операнда меняет своё значение на противоположное (0- 1, 1- 0).

Операция выполняется с помощью команды NOT. У этой команды только один операнд. Результат помещается на место операнда. Эта команда не изменяет значение флагов.

Ещё одна команда сравнения- TEST.Команда TEST выполняет операцию AND с двумя операндами и в зависимости от результата устанавливает или сбрасывает соответствующие флаги. Результат не сохраняется. TEST используется для проверки бит, например в регистре:

Test eax, 100b

jnz смещение

Команда jnz выполнит переход, если в регистре eax третий бит справа- установлен. Очень часто команду test используют для проверки, равен ли регистр нулю:

Test ecx, ecx

jz смещение

Команда jz выполнит переход, если ecx=0 [8].

1.3. Примеры использования битовых операций.

Примеры с использованием команды OR:

Установить 3 и 0 биты в регистре al, остальные биты не изменять.

or al, 00001001b

Допустим:

al, 11000011, тогда 3 и 0 биты будут равняться 1,т.к.:

Таким образом, операция OR служит для установки бита в 1.

Пример с использованием команды AND:

Сбросить 4 и 6 биты в регистре al, остальные биты не изменять.

and al, 10101111

Допустим:

al, 1101000, тогда 4 и 6 биты сбросятся до 1, т.к.:

Таким образом, операция AND служит для сбрасывания каких-то определённых битов.

Пример с использованием команды NOT:

Посчитать число единицы в регистре al, рассматривая байт, как набор бит.

mov cx, b :число сдвига

xor bl, bl :обнуление Bl

LL: shl al, 1 :сдвиг влево на один разряд

jnc NO :переход, если нет переноса

inc bl :иначе увеличить Bl

NO: loop LL :возврат, если сх 0

Получается, что команда NOT считает число единиц в регистре, при этом рассматривая байт, как набор битов.

Пример с использованием команды XOR:

Инвертировать 2 и 4 биты в регистре al, остальные биты не изменять.

xor al, 00010100b

Допустим al, 00001111

Из этого следует, что команда XOR инвертирует биты в регистре.

Пример с использованием команды TEST:

Дан массив из 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, ffh ;четное число единиц?

jp OK ;да, больше ничего делать не надо

or al, 80h ;нечетное дополнить до четного

jmp short OK ;бит 0 сброшен

BITOCLR: test al, ffh ;четное число единиц?

jnp OK ;нет, больше делать не нужно

or al, 80h ;нечетное дополнить до четного

OK: mov [bx], al ;записать измененный байт массива

loop BEG

QUIT: mov ax, 4c00h ;код завершения 0

int 21h ;выход в DOS

code ends

end start

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]