조립-논리적 지침

프로세서 명령어 세트는 프로그램의 필요에 따라 비트를 테스트, 설정 및 지우는 명령어 AND, OR, XOR, TEST 및 NOT 부울 논리를 제공합니다.

이 지침의 형식-

Sr. 아니. 교수 체재
1 AND 피연산자 1, 피연산자 2
2 또는 OR 피연산자 1, 피연산자 2
XOR XOR 피연산자 1, 피연산자 2
4 테스트 TEST 피연산자 1, 피연산자 2
5 아니 피연산자 1 아님

모든 경우의 첫 번째 피연산자는 레지스터 또는 메모리에있을 수 있습니다. 두 번째 피연산자는 레지스터 / 메모리 또는 즉치 (상수) 값에있을 수 있습니다. 그러나 메모리 대 메모리 작업은 불가능합니다. 이러한 명령어는 피연산자의 비트를 비교하거나 일치시키고 CF, OF, PF, SF 및 ZF 플래그를 설정합니다.

AND 명령어

AND 명령어는 비트 AND 연산을 수행하여 논리식을 지원하는 데 사용됩니다. 비트 AND 연산은 두 피연산자의 일치하는 비트가 1이면 1을 반환하고 그렇지 않으면 0을 반환합니다. 예를 들면 다음과 같습니다.

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

AND 연산은 하나 이상의 비트를 지우는 데 사용할 수 있습니다. 예를 들어, BL 레지스터에 0011 1010이 포함되어 있다고 가정합니다. 상위 비트를 0으로 지워야하는 경우 0FH로 AND합니다.

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로 AND 할 수 있습니다.

OR 명령

OR 명령어는 비트 OR 연산을 수행하여 논리식을 지원하는 데 사용됩니다. 비트 OR 연산자는 피연산자 중 하나 또는 둘 다에서 일치하는 비트가 1 인 경우 1을 반환합니다. 두 비트가 모두 0이면 0을 반환합니다.

예를 들면

Operand1:     0101
             Operand2:     0011
----------------------------
After OR -> Operand1:    0111

OR 연산은 하나 이상의 비트를 설정하는 데 사용할 수 있습니다. 예를 들어 AL 레지스터에 0011 1010이 포함되어 있다고 가정 해 보겠습니다. 하위 비트 4 개를 설정해야하며 값 0000 1111, 즉 FH로 OR 할 수 있습니다.

OR BL, 0FH                   ; This sets BL to  0011 1111

다음 예는 OR 명령어를 보여줍니다. 값 5와 3을 각각 AL 및 BL 레지스터에 저장 한 다음 명령어,

OR AL, BL

AL 레지스터에 7을 저장해야합니다-

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 연산을 구현합니다. NOT 연산은 피연산자의 비트를 반전시킵니다. 피연산자는 레지스터 나 메모리에있을 수 있습니다.

예를 들면

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