Сборка - Логические инструкции

Набор инструкций процессора предоставляет инструкции логической логики 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 используется для поддержки логических выражений путем выполнения побитовой операции AND. Побитовая операция И возвращает 1, если совпадающие биты обоих операндов равны 1, в противном случае она возвращает 0. Например -

Operand1: 	0101
             Operand2: 	0011
----------------------------
After AND -> Operand1:	0001

Операция И может использоваться для очистки одного или нескольких битов. Например, предположим, что регистр 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!

Измените значение в регистре ax на нечетную цифру, например -

mov  ax, 9h                  ; getting 9 in the ax

Программа отобразит:

Odd Number!

Аналогично, чтобы очистить весь регистр, вы можете И с 00H.

Инструкция по операционной

Инструкция 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

пример

В следующем примере демонстрируется инструкция ИЛИ. Сохраним значение 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

НЕ инструкция

Инструкция НЕ реализует побитовую операцию НЕ. Операция НЕ меняет местами биты в операнде. Операнд может быть либо в регистре, либо в памяти.

Например,

Operand1:    0101 0011
After NOT -> Operand1:    1010 1100