Использование команд логического умножения AND и TEST
Результат поразрядного логического умножения дает значение истина только в одном случае: если соответствующие разряды приемника и маски тоже установлены в 1. По этому операция эта операция используется для проверки установленных разрядов в 1.
Команда TEST используется для логического сравнения операндов с последующим условием перехода.
Пример:
Пусть в результате каких-то вычислений сформировалась целочисленная переменная х, требуется проверить содержимое 1, 2, 10, 15 битов. Проверить биты можно все сразу или по разряду. Проверку всех сразу выполним в программе на СРР побитовую проверку на ассемблере.
Бит1 0002
Бит2 0004
Бит10 0400
Бит15 8000
Результат 8406
#include <iostream.h>
int k, x=0xFA01;
void main()
{
cout<<"\n==Incoming value==\n"<<"x="<<hex<<x<<"(hex);"<<dec<<x<<"(dec)\n";
k=x&8406;
cout<<"\n Logic Multiplication Result \n"<<"k="<<hex<<k<<"(hex);"<<dec<<k<<"(dec)\n";
}
OUT:
x=FFFFFA01(hex); -1535(dec);
Logic Multiplication Result
FFFF8000(hex); -32768(dec);
|
|
FA01->1111 1010 0000 0001
8406->1000 0100 0000 0110
1000 0000 0000 0000 -> 8000 hex
Пусть начальное значение
х=FFFF CFC7 (hex) -> -12345(dec)
Результат FFFF8406(hex); -31738(hex)
Число -12345 в двоичном виде имеет единицы в битах 1,2,10,15
Код на ассеблере
Public ex AND
ex AND proc far
;test bit 1
mov ax,x
AND ax,Ox0002
mov k,ax
;test bit 2
mov ax,x
AND ax,Ox0004
mov k,ax
;test bit 10
ret
ex AND endp
Использование команд логического сложения OR
Результат поразрядного логического сложения дает 0 только в случае если соответствующие разряды приемника или маски = 0
Использование команды логического сложения по модулю XOR
Эта команда дает значение 0 если соответствующие приемника и маски ОДИНАКОВЫЕ. Истина (1) получается если соответствующие разряды приемника и маски разные.
Команда логического отрицания NOT
Используется для инверсии.
k=~x; поразрядное НЕ
k=!x; НЕ
КОМАНДЫ СДВИГА
Это другая разновидность побитовых команд. Они перемещают биты в поле операнда "приемник" либо влево либо вправо.
Имя_команды приемник, источник
Сдвиг:
1. Линейный
a. Арифметический
b. Логический
2. Цикличный
Допустимые сочетания операндов для команд сдвигов
Приемник | Источник(счетчик) | Пояснение |
R8 | Сдвиг на 1 разряд | |
R16 | Сдвиг на 1 разряд | |
Mem8 | Сдвиг на 1 разряд | |
Mem16 | Сдвиг на 1 разряд | |
R8 | CL | Сдвиг указан в CL |
R16 | CL | Сдвиг указан в CL |
Mem8 | CL | Сдвиг указан в CL |
Mem16 | CL | Сдвиг указан в CL |
R8 | Im8 | Сдвиг на 1 разряд |
R16 | Im8 | Сдвиг на 1 разряд |
Mem8 | Im8 | Сдвиг на 1 разряд |
Mem16 | Im8 | Сдвиг на 1 разряд |
.................
Линейные команды сдвига добавляют ноль в младший разряд при сдвиге влево либо в старший разряд при сдвиге вправо. При сдвиге вправо старший разряд различается для знаковых или без знаковых чисел.
|
|
Удаляемые из операнда разряды последовательно перемещаются в регистр флагов CF
Эти команды позволяют очень быстро выполнять деление операндов сдвиг вправо и умножение - сдвиг влево на степени числа 2
SAL - Shift Arithmetical operand Left
SAR - Shift Arithmetical operand Right
Применяются для знаковых целочисленых данных
Логика работы команды SAL
CF | Знаковый бит | Инф. Разряд | Мл.разряд | |
<---- | <------------- | -------------- |
Логика работы команды SAR
Таблица
Пример
mov al,58
sal al,1;сдвиг влево на 1 разряд
sal al,3
Таблица
Выводы:
· Изначально в регистре al хранилось число 58
· Сдвиг al=116
· Следующий сдвиг НЕКОРЕКТЕН АХАХАХА т.к. результат не помещается в байт
· При использовании сдвига следует четко представлять диапазон допустимых значений в поле операнда
· На знаковый бит у команды sal нет никакой реакции
КОМАНДЫ ЛОГИЧЕСКОГО СДВИГА SHL,SHR
Предназначен для работы с без знаковыми целыми числами. Абсолютно одинаковы с командами SAL и SAR
КОМАНДЫ ЦИКЛИЧЕСКОГО СДВИГА
В отличии от арифметического и логического сдвига эти команды сохраняют значение сдвигаемых бит. Команды делятся на 2 группы:
· Команды простого циклического сдвига
o ROL
o ROR
· Команды циклического сдвига через флаг переноса CF
o RCL
o RCR
Логика работы команды ROL
Таблица
Логика работы команды RCR
Таблица
Команды передачи управления
Команды безусловной передачи управления
Адрес следующей выполняемой команды находится в регистре IP (Instruction Pointer) команды передачи управления позволяют нарушить естественную последовательность команд посредством изменения содержимого регистра IP.
В ассемблере есть 3 группы базовых команд передачи управления
· Команды безусловного перехода на определенный адрес в памяти
· Команды перехода в зависимости от проверки результатов условия
· Команды организации циклических вычислений
Команды передачи управления не изменяют значения флагов
КОМАНДЫ БЕЗУСЛОВНОГО ПЕРЕХОДА
· JMP. Аналог высокоуровнего goto метка. JMP метка. Метка помечает команду на которую нужно передать управление. Метка может иметь 2 атрибута
o NEAR(deafult). <IP>=<IP>+смещение к команде. Смещение не более 2х байт. Команда на которую указывает метка может распологаться в сторону больших адресов. JMP FORWARD/JMP BACK. Можно с экономить 1 байт если задать короткий переход (1 байтовое смещение) JMP SHORT метка.
o FAR. Безусловный переход осуществляется в другой сегмент. В этом меняется не только содержимое регистра IP, но и изменяется содержимое регистра CS. <CS>=<CS>+Code
· CALL.
o Идейно команда call аналогична команде JMP, но команда call вызывает процедуру и возвращает к точке прыжка. Адрес начальной точки сохраняется в стеке. CALL имя_процедуры. Если у процедуры есть параметны то они передаются в стек до вызова процедуры. Разные языки по разному работают с параметрами процедуры. Для учета этого команду CALL следует использовать в расширеном синтаксисе.
CALL имя_процедуры, язык, параметр1...параметр N
§ NEAR.
PUSH IP
<IP>=<IP>+смещение
§ FAR.
PUSH IP
PUSH CS
<IP>=<IP>+смещение
<CS>=<CS>+Code
· RET. Команда возврата в точку вызова из процедуры. Эта команда команда обратная команде CALL она обеспечивает возврат управления вызывающей команде и если нужно очистку стека на величину 16-ти разрядной константы. RET [Im16]