Учебники

Сборка — логические инструкции

Набор команд процессора содержит инструкции логики 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

Следующая программа иллюстрирует это —

пример

Live Demo

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 —

Live Demo

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 меняет биты в операнде. Операнд может быть либо в регистре, либо в памяти.

Например,