조립-논리적 지침
프로세서 명령어 세트는 프로그램의 필요에 따라 비트를 테스트, 설정 및 지우는 명령어 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