Набор команд процессора содержит инструкции логики AND, OR, XOR, TEST и NOT, которые проверяют, устанавливают и очищают биты в соответствии с потребностями программы.
Формат для этих инструкций —
Sr.No. | инструкция | Формат |
---|---|---|
1 | А ТАКЖЕ | И операнд1, операнд2 |
2 | ИЛИ ЖЕ | ИЛИ операнд1, операнд2 |
3 | XOR | XOR операнд1, операнд2 |
4 | ТЕСТОВОЕ ЗАДАНИЕ | ТЕСТ операнд1, операнд2 |
5 | НЕ | НЕ операнд1 |
Первый операнд во всех случаях может быть либо в регистре, либо в памяти. Второй операнд может быть либо в регистре / памяти, либо в непосредственном (постоянном) значении. Однако операции с памятью в память невозможны. Эти инструкции сравнивают или сопоставляют биты операндов и устанавливают флаги CF, OF, PF, SF и ZF.
Инструкция И
Инструкция AND используется для поддержки логических выражений путем выполнения побитовой операции AND. Побитовая операция И возвращает 1, если совпадающие биты обоих операндов равны 1, в противном случае она возвращает 0. Например, —
Operand1: 0101 Operand2: 0011 ---------------------------- After AND -> Operand1: 0001
Операция AND может использоваться для очистки одного или нескольких битов. Например, допустим, регистр BL содержит 0011 1010. Если вам нужно очистить старшие биты до нуля, вы И это с 0FH.
AND BL, 0FH ; This sets BL to 0000 1010
Давайте рассмотрим другой пример. Если вы хотите проверить, является ли данное число нечетным или четным, простой тест будет проверять младший значащий бит числа. Если это 1, число нечетное, иначе число четное.
Предполагая, что номер находится в регистре AL, мы можем написать —
AND AL, 01H ; ANDing with 0000 0001 JZ EVEN_NUMBER
Следующая программа иллюстрирует это —
пример
section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov ax, 8h ;getting 8 in the ax and ax, 1 ;and ax with 1 jz evnn mov eax, 4 ;system call number (sys_write) mov ebx, 1 ;file descriptor (stdout) mov ecx, odd_msg ;message to write mov edx, len2 ;length of message int 0x80 ;call kernel jmp outprog evnn: mov ah, 09h mov eax, 4 ;system call number (sys_write) mov ebx, 1 ;file descriptor (stdout) mov ecx, even_msg ;message to write mov edx, len1 ;length of message int 0x80 ;call kernel outprog: mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data even_msg db 'Even Number!' ;message showing even number len1 equ $ - even_msg odd_msg db 'Odd Number!' ;message showing odd number len2 equ $ - odd_msg
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Even Number!
Измените значение в регистре топоров с нечетной цифрой, например:
mov ax, 9h ; getting 9 in the ax
Программа будет отображать:
Odd Number!
Точно так же очистить весь регистр вы можете И с 00H.
Инструкция OR
Инструкция OR используется для поддержки логического выражения путем выполнения побитовой операции OR. Оператор побитового ИЛИ возвращает 1, если совпадающие биты из одного или обоих операндов равны единице. Возвращает 0, если оба бита равны нулю.
Например,
Operand1: 0101 Operand2: 0011 ---------------------------- After OR -> Operand1: 0111
Операция ИЛИ может использоваться для установки одного или нескольких битов. Например, предположим, что регистр AL содержит 0011 1010, вам нужно установить четыре младших бита, вы можете ИЛИ со значением 0000 1111, т.е. FH.
OR BL, 0FH ; This sets BL to 0011 1111
пример
В следующем примере демонстрируется инструкция OR. Давайте сохраним значения 5 и 3 в регистрах AL и BL, соответственно, затем инструкцию,
OR AL, BL
следует хранить 7 в регистре AL —
section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov al, 5 ;getting 5 in the al mov bl, 3 ;getting 3 in the bl or al, bl ;or al and bl registers, result should be 7 add al, byte '0' ;converting decimal to ascii mov [result], al mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 1 int 0x80 outprog: mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .bss result resb 1
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
7
Инструкция XOR
Инструкция XOR реализует побитовую операцию XOR. Операция XOR устанавливает результирующий бит в 1, если и только если биты из операндов отличаются. Если биты из операндов одинаковы (оба 0 или оба 1), результирующий бит сбрасывается в 0.
Например,
Operand1: 0101 Operand2: 0011 ---------------------------- After XOR -> Operand1: 0110
XORing операнда с собой изменяет операнд на 0 . Это используется для очистки регистра.
XOR EAX, EAX
ТЕСТ Инструкция
Инструкция TEST работает так же, как и операция AND, но в отличие от инструкции AND она не меняет первый операнд. Таким образом, если нам нужно проверить, является ли число в регистре четным или нечетным, мы также можем сделать это, используя инструкцию TEST, не меняя исходного числа.
TEST AL, 01H JZ EVEN_NUMBER
НЕ инструкция
Инструкция NOT реализует побитовую операцию NOT. Операция NOT меняет биты в операнде. Операнд может быть либо в регистре, либо в памяти.
Например,