NOP (코드)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
NOP (No Operation)은 컴퓨터 아키텍처에서 아무런 동작도 수행하지 않는 명령어를 의미한다. 다양한 CPU 아키텍처에서 NOP 명령어는 각기 다른 명령어와 코드로 구현되며, x86, ARM, MIPS 등 다양한 CPU 아키텍처에서 사용된다. 고급 언어에서는 C/C++의 널 문, 파이썬의 `pass` 문, 자바스크립트의 빈 문 등을 NOP와 유사하게 활용할 수 있다. NOP 명령어는 타이밍 및 동기화, 코드 정렬, 자리 표시자, 디버깅 및 패치 등 다양한 목적으로 활용되며, 보안 분야에서는 NOP 슬라이드 형태로 소프트웨어 크래킹에 사용되기도 한다. 또한, 텔넷, FTP, SMTP 등 통신 프로토콜에서도 연결 유지 및 응답 확인을 위해 NOP 명령어가 사용된다.
더 읽어볼만한 페이지
- 기계어 - 브랜치 (컴퓨터 과학)
프로그램 실행 흐름을 제어하는 명령어인 브랜치는 점프, 호출, 반환 명령어로 나뉘며, CPU 플래그 레지스터와 주소 지정 방식을 활용하여 코드 분기 및 서브루틴 호출/반환을 수행하지만, 파이프라인 CPU에서 성능 저하를 유발하여 분기 예측 등의 기술로 해결합니다. - 기계어 - 주소 지정 방식
- 무 (철학) - 절대 영도
절대영도는 열역학적으로 정의된 최저 온도로, 물질 입자의 에너지가 최소 상태이며, 엔트로피가 0이 되지만, 양자역학적 영점 진동으로 인해 실험적으로 도달할 수 없고, 극저온에서 특이한 양자 현상이 나타나며, 열역학 제3법칙에 따라 유한 번의 조작으로 도달할 수 없다. - 무 (철학) - 무색
무색은 특정한 색깔이 없는 상태로, 투명, 흰색, 무채색 등의 의미로 사용되며 투명과 밀접한 관련이 있지만 동일한 의미는 아니다. - X86 명령어 - 스트리밍 SIMD 확장
스트리밍 SIMD 확장(SSE)은 x86 아키텍처의 SIMD 명령어 집합으로, 128비트 XMM 레지스터를 사용하여 데이터 병렬 처리를 통해 성능을 향상시키며, 인텔 펜티엄 III 프로세서에 처음 도입되어 여러 후속 버전으로 발전했다. - X86 명령어 - SSE2
SSE2는 인텔이 개발한 x86 아키텍처의 SIMD 명령어 집합 확장으로, MMX 명령어의 정수 벡터 연산을 확장하고 XMM 레지스터를 사용하여 부동 소수점 연산 성능을 향상시키며, AMD64 아키텍처에서도 지원된다.
NOP (코드) | |
---|---|
NOP (No Operation) | |
종류 | 명령어 |
구분 | 의사 명령어 |
용도 | 시간 지연, 코드 패딩, 디버깅 |
다른 이름 | No-Op, Skip, Do Nothing |
관련 명령어 | 분기 명령어, halt 명령어 |
세부 정보 | |
기능 | CPU에서 아무런 연산을 수행하지 않고 다음 명령어로 진행 |
사용 이유 | 코드 실행 시간 미세 조정 프로그램 패치 공간 확보 디버깅 용이성 확보 파이프라인 비우기 |
아키텍처별 구현 | 다양한 방식으로 구현될 수 있으며, 일부 아키텍처에서는 특정 명령어를 NOP으로 사용 |
예시 (x86) | |
Opcode | 90 (1바이트 NOP) |
어셈블리어 | NOP |
기계어 (16진수) | 90 |
설명 | x86 아키텍처에서 1바이트 NOP 명령어 |
2. 기계어 수준의 NOP 명령어
다양한 CPU 아키텍처에서 NOP 명령어는 각기 다른 명령어와 코드로 구현된다.
CPU 아키텍처 | Mnemonic | 바이트 | Opcode |
---|---|---|---|
인텔 x86 CPU 계열 | NOP | 1; 1–9 (i686) | 0x90; 0x66 0x90[27] |
인텔 8051 / MCS-51 계열 | NOP | 1 | 0x00 |
ARM A32 | NOP | 4 | 0x00000000 |
ARM T32 (16비트) | NOP | 2 | 0xb000 |
ARM T32 (32비트) | NOP | 4 | 0xf3af 8000 |
ARM A64 (64비트) | NOP | 4 | 0xd503201f |
IBM 시스템/360, IBM 시스템/370, 유니박 시리즈 90 | NOP | 4 | 0x47000000 또는 0x470nnnnn 또는 0x47n0nnnn (여기에서 "n"은 임의의 4비트 값) |
NOPR | 2 | 0x0700 또는 0x070n 또는 0x07n0 (여기에서 "n"은 임의의 4비트 값) | |
SuperH | NOP | 2 | 0x0009 |
MIPS | NOP | 4 | 0x00000000 |
MIPS-X | NOP | 4 | 0x60000019 |
MMIX | SWYM | 4 | 0xfd** |
모토로라 68000 패밀리 | NOP | 2 | 0x4e71 |
모토로라 6809 | NOP | 1 | 0x12 |
MOS 테크놀로지 65xx (예: 6502) | NOP | 1 | 0xea |
파워PC | NOP | 4 | 0x60000000 |
PIC 마이크로컨트롤러 | NOP | 12비트 | 0b000000000000 |
SPARC | NOP | 4 | 0x01000000 |
Z80 | NOP | 1 | 0x00 |
PDP-11 | NOP | 16비트 | 000240 (8진법) |
VAX | NOP | 1 | 0x01 |
일부 컴퓨터 명령어 집합은 프로그래머가 접근할 수 있는 프로세서 레지스터, 프로세스 상태, 메모리의 상태를 변경하지 않는 NOP 명령어를 포함한다. NOP는 보통 정해진 수의 클럭 사이클을 실행한다.
NOP는 메모리 오류나 페이지 오류를 일으킬 수 있는 메모리 접근을 하지 않는다.
NOP는 다음과 같은 목적으로 사용된다.
- 타이밍
- 메모리 정렬
- 위험 방지
- 분기 지연 슬롯 채우기
- 기존 명령어 무효화
- 실행 명령어 대상
- 자리 표시자 (또는 제거된 명령어 대체)
NOP는 파이프라인 동기화와 같은 부작용을 가질 수 있다.[1]
2. 1. x86 아키텍처
x86영어 아키텍처에서 NOP 명령어는 `0x90` 코드로 표현되며, `XCHG AX, AX` 명령어와 동일하다.[2] 16비트 코드에서는 `XCHG AX, AX`, 32비트 코드에서는 `XCHG EAX, EAX`에 대한 1바이트 인코딩이다. 롱 모드에서는 `XCHG RAX, RAX`가 `REX.W` 접두사로 시작하므로 2바이트가 필요하며, 인코딩은 0x48 0x90이 된다. 그러나 0x90은 0x48이 앞에 오는지 여부에 관계없이 롱 모드에서 `NOP`로 해석된다.[2]펜티엄 프로 이후의 인텔 프로세서와 모든 AMD AMD64 프로세서에서는 2–9 바이트 길이의 다중 바이트 `NOP` 명령어를 지원한다.[2] 이러한 명령어들은 다음과 같다.
- 0x66 0x90
- 0x0F 0x1F 0x00
- 0x0F 0x1F 0x40 0x00
- 0x0F 0x1F 0x44 0x00 0x00
- 0x66 0x0F 0x1F 0x44 0x00 0x00
- 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00
- 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00
- 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00[2]
여기서 0x66은 피연산자 크기 재정의 접두사이고, 0x0F 0x1F는 동작이 수행되지 않는 ModRM 피연산자를 사용하는 2바이트 NOP 연산 코드이다. 0x00은 `[EAX]`, 0x40 0x00은 `[EAX + 00H]`, 0x44 0x00 0x00은 `[EAX + EAX*1 + 00H]`, 0x80 0x00 0x00 0x00 0x00은 `[EAX + 00000000H]`, 0x84 0x00 0x00 0x00 0x00 0x00은 `[EAX + EAX*1 + 00000000H]`이다.[2]
AMD64에서는 32비트와 64비트의 조정을 위해 "암묵적인 제로 확장"이라는 사양이 적용된다. 이에 따라 64비트 레지스터 RAX에 대해 32비트 연산으로 `XCHG EAX, EAX`에 해당하는 동작을 한 경우, 상위 32비트가 리셋되어야 하므로 NOP로 재정의되었다.
2. 2. ARM 아키텍처
ARM 아키텍처에서는 명령어 모드에 따라 NOP 명령어의 코드와 길이가 다르다.명령어 모드 | 니모닉 | 바이트 수 | Opcode | 비고 |
---|---|---|---|---|
ARM A32 | NOP | 4 | 0x00000000 | andeq r0, r0, r0 를 나타낸다. 어셈블리 명령어 nop 는 0xE1A00000으로 인코딩된 mov r0, r0 으로 확장될 가능성이 높다(리틀 엔디안 아키텍처).[4] |
ARM T32 (16 비트) | NOP | 2 | 0xb000 | ADD SP, #0 에 대한 연산 코드 - 스택 포인터에 0을 더한다(연산 없음). 어셈블리 명령어 nop 는 0x46C0으로 인코딩된 mov r8, r8 로 확장될 가능성이 높다.[5] |
ARM T32 (32 비트) | NOP | 4 | 0xF3AF 8000 | |
ARM A64 (64 비트) | NOP | 4 | 0xD503201F |
2. 3. 기타 아키텍처
MIPS 아키텍처에서 NOP 명령어는 `0x00000000`으로 표현되며, `sll r0,r0,0`을 나타낸다. 이는 레지스터 0을 0비트만큼 왼쪽으로 논리 시프트하고 결과를 레지스터 0에 저장하는 것을 의미하지만, 레지스터 0에 대한 쓰기는 무시되므로 아무런 연산도 수행되지 않는다.[26] MIPS-X에서는 NOP가 `0x60000019` (`add r0,r0,r0`에 대한 확장 연산 코드)로 표현된다.PowerPC 아키텍처에서 NOP 명령어는 `0x60000000`이며, `ori r0,r0,0`에 대한 확장 연산 코드이다.
SPARC 아키텍처에서 NOP 명령어는 `0x01000000`이며, `sethi 0, %g0`을 나타낸다. 이는 하드웨어로 0인 `%g0` 레지스터를 0으로 설정하는 명령어로, 실질적으로 아무런 연산도 수행하지 않는다.[8]
이 외에도, 다음과 같은 아키텍처에서 NOP 명령어를 지원한다.
아키텍처 | 명령어 니모닉 | 바이트 | Opcode | 비고 |
---|---|---|---|---|
DEC Alpha | `NOP` | 4 | 0x47FF041F | `BIS r31,r31,r31`에 대한 연산 코드 (항상 0인 레지스터를 자체적으로 비트 단위 OR) |
AMD 29k | `NOP` | 4 | 0x70400101 | `aseq 0x40,gr1,gr1`에 대한 연산 코드 (스택 레지스터가 자체와 같다는 것을 단언).[3] |
SuperH | `NOP` | 2 | 0x0009 | |
MIX | `NOP` | 1 단어 | ± * * * * 0 | * 바이트는 임의의 값이며 0부터 최대 바이트(63-99 범위)까지 가능. MIX는 부호-크기 표현을 사용. |
MMIX | `SWYM` | 4 | 0xFD | SWYM은 "Sympathize with your machinery"를 나타냄. * 숫자는 임의로 선택 가능. |
PA-RISC | `NOP` | 4 | 0x08000240 | `OR 0,0,0`에 대한 연산 코드.[6] |
RISC-V | `NOP` | 4 | 0x00000013 | `ADDI x0, x0, 0` |
`C.NOP` | 2 | 0x0001 | `C.ADDI x0, 0`. "C"(압축 명령어) 확장을 지원하는 RISC-V CPU에서만 사용 가능.[7] | |
Signetics 8X300 | `MOV AUX, AUX` | 16 비트 | 0x0000 | 회전 없이 AUX를 AUX로 이동 |
PDP-10 | `JFCL 0,` (관례적) `JUMP, SETA, SETAI, CAI, TRN, TLN` | 1 단어 | 25500* (8진수) | 분기 없음 분기 없음, 아무것도 설정하지 않음, 건너뛰기 없음 |
PDP-11 | `NOP` | 2 | 000240 (8진수) | 조건 코드를 아무것도 지우지 않음 |
VAX | `NOP` | 1 | 0x01 | 지연은 프로세서 유형에 따라 다름 |
WD16 | `NOP` | 2 | 0x0000 |
에이다에서는 `null` 문이 NOP 역할을 한다.[28] 제이쿼리 라이브러리는 아무것도 하지 않는 `jQuery.noop()` 함수를 제공한다.[29] 함수 또는 프로그래밍 언어의 문장 시퀀스는 아무런 효과가 없으면 NOP 또는 널(null) 문이라고 한다. 널 문은 특정 상황에서 일부 언어의 구문에 의해 요구될 수 있다.
3. 고급 언어에서의 NOP
포트란에서 `CONTINUE` 문은 DO 루프의 마지막 문과 같은 일부 컨텍스트에서 사용되지만, 어디에서나 사용할 수 있으며 어떤 기능도 수행하지 않는다.
파스칼에서 단독으로 사용되는 세미콜론(;)은 널 문으로 사용될 수 있다. 언어 사양에 따라 BEGIN/END 블록에서 END 문 앞에 세미콜론을 사용하는 것은 선택 사항이므로, 여기에 사용된 세미콜론은 불필요하다. 또한 `BEGIN END;`로 구성된 블록은 다른 BEGIN/END 블록 안에 배치된 경우에도 아무런 동작을 나타내지 않는 자리 표시자로 사용될 수 있다.
C, 파이썬, 자바스크립트에서 NOP 또는 이와 유사한 기능을 하는 구문은 다음과 같다.언어 NOP 구문/함수 설명 C/C++ ;
(널 문) 또는 {}
(빈 블록)가장 간단한 형태의 NOP. 컴파일러는 코드를 생성하지 않는다.[9] 파이썬 pass
아무런 효과가 없는 문. 들여쓰기 기반 구문에서 빈 블록을 표현할 때 사용.[28] 자바스크립트 ;
(빈 문) 또는 {}
(빈 블록 문)C 및 파생어와 동일한 방식. undefined
또는 null
(표현식 문)구문상 빈 문이나 블록 문이 허용되지 않을 때 사용. Function.prototype()
, jQuery.noop()
,
angular.noop
, _.noop()
등함수가 필요한 상황에서 사용 가능한 내장/라이브러리 함수. 사용자 정의 NOP 함수도 정의 가능.
NOP(No Operation)이라는 표현은 종종 아무 일도 일어나지 않는 함수나 코드를 지칭하는 데 사용될 수 있다 (이 경우 '''중복 코드'''라고 불리기도 한다). 컴파일러 최적화에서는 이러한 코드를 감지하여 삭제하기도 한다.
3. 1. C/C++
C/C++에서 가장 간단한 NOP 문은 널 문으로, 세미콜론(`;`) 하나만 사용하는 것이다.[9]
```c
;
```
빈 블록({}) 또한 NOP이며, 컴파일러는 이에 대한 코드를 생성하지 않는다.[9]
```c
{}
```
함수의 본문과 같은 경우, 블록을 사용해야 하지만 비어 있을 수 있다. C 언어에서 문은 비어 있을 수 없으며, 단순 문은 `;`(세미콜론)으로 끝나야 하고, 복합 문은 `{}`(중괄호)로 묶이는데, 이 자체는 뒤에 세미콜론이 필요하지 않다. 따라서 문법적으로 문이 필요한 컨텍스트에서는 이러한 널 문을 사용할 수 있다.[9]
널 문 자체는 쓸모가 없지만, 루프 내에서 구문론적인 용도로 사용될 수 있다.[9]
```c
while (getchar() != '\n') {}
```
위 코드는 `getchar()` 함수가 `\n` (개행) 문자를 반환할 때까지 호출하여 표준 입력의 현재 읽기 위치를 다음 줄의 시작 부분으로 이동시킨다.[9]
3. 2. Python
파이썬 프로그래밍 언어에는 실행 시 아무런 효과가 없는 `pass` 문이 있으며, 이는 NOP 역할을 한다.[28] 주로 파이썬의 들여쓰기 기반 구문으로 인해 정확한 구문을 보장하기 위해 사용된다. 예를 들어, 클래스 정의 구문은 클래스 로직이 포함된 들여쓰기 블록을 필요로 하며, 비어 있어야 할 경우 `pass`로 표현해야 한다.[28]
예시는 다음과 같다.
```python
class Foo(Bar): # 클래스를 상속한다
pass # (재)정의할 내용이 아무것도 없다
3. 3. JavaScript
JavaScript 언어에는 내장된 NOP 문이 없다. 하지만 다음과 같은 여러 방법으로 NOP를 구현할 수 있다.
함수가 필요한 상황에서는 다음과 같은 방법을 사용할 수 있다.
몇몇 라이브러리들은 NOP 함수를 제공한다.
NOP (No Operation)는 아무 일도 일어나지 않는 함수나 코드를 가리키는 데 사용될 수 있다. (이러한 코드는 '''중복 코드'''라고도 불린다.) 컴파일러 최적화에서는 이러한 코드를 감지하여 삭제하기도 한다.
4. NOP 명령어의 활용
- 타이밍 및 동기화: 특정 시간 동안 대기하거나, 외부 장치 또는 다른 프로그램과의 동기화를 위해 사용될 수 있다.
- 코드 정렬: 메모리 정렬을 강제하여 성능을 향상시키는 데 사용될 수 있다.
- 자리 표시자: 프로그램 개발 후반부에 활성 명령어로 대체될 자리 표시자로 사용될 수 있다. 즉, 나중에 추가될 코드를 위한 공간을 확보하거나 제거된 코드를 대체하는 데 사용된다.
- 디버깅 및 패치: 점프 명령어의 점프 대상 지표, 코드를 디버깅하거나, 런타임 중에 코드를 수정(패치)하는 데 사용될 수 있다.
- 분기 지연 슬롯 채우기: 분기 지연 슬롯을 채우는 데 사용될 수 있다.
- 명령어 무효화: 점프와 같은 기존 명령어를 무효화하는 데 사용될 수 있다.
- 실행 명령어의 대상: 실행 명령어의 대상으로 사용될 수 있다.
- 원칩 마이크로컴퓨터의 PROM 재사용: 0x00 또는 0xff 중 "덮어쓰기가 가능한 쪽"으로 덮어쓰면 NOP가 되도록 해두면 재사용에 편리하다.
어떤 경우에는 NOP가 사소한 부작용을 가질 수 있다. 예를 들어, Motorola 68000 계열 프로세서에서는 NOP 연산 코드가 파이프라인의 동기화를 유발한다.[1]
하드웨어 설계 관점에서 볼 때, 버스의 맵핑되지 않은 영역은 종종 0을 반환하도록 설계된다. NOP 슬라이드 동작이 종종 바람직하므로, 모든 0 연산 코드로 코딩하는 경향이 있다.
기계어에서 NOP는 많은 명령어 집합에서 제공되는 명령어이다. 프로세서는 이 명령어를 읽으면 문자 그대로 "아무것도 하지 않고" 프로그램 카운터의 증가만 수행한다. 자체적으로는 아무 의미도 없는 명령어이지만, 위에 언급한 여러가지의 이유들로 사용된다.
규칙적으로 명령어를 결정한 결과, 아무 의미도 없는 명령어 (동일 레지스터에서의 이동, 다음 주소로의 점프)가 만들어져 그것을 NOP로 사용하기도 하고, 전용 명령어로 준비되기도 한다. 1950년대의 EDSAC에서 이미 NOP에 해당하는 명령어가 설계자들에게 인식되었다.
x86에서는, 명령어 배열에서 `XCHG AX, AX`에 해당하는 부분이 NOP이며, 8086으로 시작하는 16비트 시대에는 내부적으로 그대로 동작했던 것도 있었을 것으로 보인다.
4. 1. 타이밍 및 동기화
NOP 명령어는 특정 시간 동안 대기하거나, 외부 장치 또는 다른 프로그램과의 동기화를 위해 사용될 수 있다.[1] NOP는 다음과 같은 목적으로 활용된다.- 타이밍을 맞추기 위해 사용된다.
- 외부 기기나 다른 프로그램과의 동기화를 위해 시간을 맞춘다.
일부 CPU 아키텍처의 NOP 명령어는 다음과 같다.
CPU 아키텍처 | 명령어 니모닉 | 바이트 | Opcode | 비고 |
---|---|---|---|---|
인텔 x86 CPU 제품군 | `NOP` | 1 | 0x90[2] | 0x90은 16비트 코드에서는 `XCHG AX,AX`, 32비트 코드에서는 `XCHG EAX,EAX`에 대한 1바이트 인코딩이다. 롱 모드에서는 `XCHG RAX,RAX`가 `REX.W` 접두사로 시작하므로 2바이트가 필요하며, 인코딩은 0x48 0x90이 된다. 그러나 0x90은 0x48이 앞에 오는지 여부에 관계없이 롱 모드에서 `NOP`로 해석된다.[2] |
다중 바이트 `NOP` | 펜티엄 프로 이후의 인텔 프로세서와 모든 AMD AMD64 프로세서에 대해 2–9 | 0x66은 피연산자 크기 재정의 접두사이다. 0x0F 0x1F는 동작이 수행되지 않는 ModRM 피연산자를 사용하는 2바이트 NOP 연산 코드이다. 0x00은 `[EAX]`, 0x40 0x00은 `[EAX + 00H]`, 0x44 0x00 0x00은 `[EAX + EAX*1 + 00H]`, 0x80 0x00 0x00 0x00 0x00은 `[EAX + 00000000H]`, 0x84 0x00 0x00 0x00 0x00 0x00은 `[EAX + EAX*1 + 00000000H]`.[2] | ||
인텔 8008 | `LAA` | 1 | 0xC0 | A를 A에서 로드 |
인텔 8051 / MCS-51 제품군 | `NOP` | 1 | 0x00 | |
인텔 8080, 인텔 8085, Z80 | `NOP` | 1 | 0x00 | |
DEC Alpha | `NOP` | 4 | 0x47FF041F | `BIS r31,r31,r31`에 대한 연산 코드, 즉 항상 0인 레지스터를 자체적으로 비트 단위 OR하는 명령어. |
AMD 29k | `NOP` | 4 | 0x70400101 | `aseq 0x40,gr1,gr1`에 대한 연산 코드, 즉 스택 레지스터가 자체와 같다는 것을 단언하는 명령어.[3] |
ARM A32 | `NOP` | 4 | 0x00000000 | 이는 `andeq r0, r0, r0`를 나타낸다. 어셈블리 명령어 `nop`는 0xE1A00000으로 인코딩된 `mov r0, r0`으로 확장될 가능성이 높다(리틀 엔디안 아키텍처).[4] |
ARM T32 (16 비트) | `NOP` | 2 | 0xb000 | `ADD SP, #0`에 대한 연산 코드 - 스택 포인터에 0을 더한다(연산 없음). 어셈블리 명령어 `nop`는 0x46C0으로 인코딩된 `mov r8, r8`로 확장될 가능성이 높다.[5] |
ARM T32 (32 비트) | `NOP` | 4 | 0xF3AF 8000 | |
ARM A64 (64 비트) | `NOP` | 4 | 0xD503201F | |
AVR | `NOP` | 2 | 0x0000 | 1 클럭 사이클 |
IBM System/360, IBM System/370, IBM System/390, z/Architecture, UNIVAC Series 90 | `NOP` | 4 | 0x47000000 또는 0x470nnnnn 또는 0x47n0nnnn 여기서 "n"은 임의의 4비트 값이다. | NOP ("No-Op") 및 NOPR ("No-Op Register")은 각각 "Branch on Condition" 또는 "Branch on Condition Register" 명령어의 서브셋이다. 두 버전 모두 NO-OP를 생성하는 두 가지 옵션이 있다. |
`NOPR` | 2 | 0x0700 또는 0x070n 또는 0x07n0 여기서 "n"은 임의의 4비트 값이다. | ||
SuperH | `NOP` | 2 | 0x0009 | |
MIPS | `NOP` | 4 | 0x00000000 | `sll r0,r0,0`을 나타내며, 이는 레지스터 0을 0비트만큼 왼쪽으로 논리적으로 시프트하고 결과를 레지스터 0에 저장하는 것을 의미한다. 레지스터 0에 대한 쓰기는 무시된다. 항상 0을 포함한다. |
MIPS-X | `NOP` | 4 | 0x60000019 | (`add r0,r0,r0`에 대한 확장 연산 코드) |
MIX | `NOP` | 1 단어 | ± * * * * 0 | * 바이트는 임의의 값이며 0부터 최대 바이트(63-99 범위에 있어야 함)까지 가능하다. MIX는 부호-크기 표현을 사용한다. |
MMIX | `SWYM` | 4 | 0xFD | SWYM은 "Sympathize with your machinery"를 나타낸다. * 숫자는 임의로 선택할 수 있다. |
Motorola 6800 | `NOP` | 1 | 0x01 | |
Motorola 68000 제품군 | `NOP` | 2 | 0x4E71 | 이는 파이프라인을 동기화하고 명령어 중복을 방지한다.[1] |
Motorola 6809 | `NOP` | 1 | 0x12 | |
MOS Technology 65xx (예: 6502) | `NOP` | 1 | 0xEA | `NOP`는 두 클럭 사이클을 소모한다. 정의되지 않은 연산 코드는 65xx 제품군의 NMOS 버전에서 65C02에서 다양한 명령어 길이 및 사이클 시간을 가진 NOP로 변환되었다. |
PA-RISC | `NOP` | 4 | 0x08000240 | `OR 0,0,0`에 대한 연산 코드.[6] |
`LDI 26,0` | 4 | 0x34000034 | 팰린드롬 NOP - 즉, 바이트 순서가 리틀 엔디안 또는 빅 엔디안으로 해석되는지 여부에 관계없이 NOP로 실행되는 명령어이다. 일부 PA-RISC 시스템 명령어는 7개의 팰린드롬 NOP가 뒤따라야 한다.[6] | |
PowerPC | `NOP` | 4 | 0x60000000 | (ori r0,r0,0 에 대한 확장 연산 코드) |
PIC 마이크로컨트롤러 | `NOP` | 12 비트 | 0b000000000000 | |
RISC-V | `NOP` | 4 | 0x00000013 | `ADDI x0, x0, 0` |
`C.NOP` | 2 | 0x0001 | `C.ADDI x0, 0`. "C"(압축 명령어) 확장을 지원하는 RISC-V CPU에서만 사용할 수 있다.[7] | |
Signetics 8X300 | `MOV AUX, AUX` | 16 비트 | 0x0000 | 회전 없이 AUX를 AUX로 이동 |
SPARC | `NOP` | 4 | 0x01000000 | `sethi 0, %g0`을 나타내며, 이는 하드웨어로 0인 `%g0` 레지스터를 0으로 만든다.[8] |
PDP-10 | `JFCL 0,` (관례적)JUMP, SETA, SETAI, CAI, TRN, TLN | 1 단어 | 25500* (8진수) | 분기 없음 분기 없음, 아무것도 설정하지 않음, 건너뛰기 없음 |
PDP-11 | `NOP` | 2 | 000240 (8진수) | 조건 코드를 아무것도 지우지 않음 |
VAX | `NOP` | 1 | 0x01 | 지연은 프로세서 유형에 따라 다름 |
WD16 | `NOP` | 2 | 0x0000 |
4. 2. 코드 정렬
NOP 명령어는 메모리 상에서 코드를 정렬하여 성능을 향상시키는 데 사용될 수 있다. NOP는 타이밍 목적으로, 메모리 정렬을 강제하기 위해 사용된다.[1]다음은 일부 CPU 아키텍처의 NOP 명령어 목록이다.
CPU 아키텍처 | 명령어 니모닉 | 바이트 | Opcode | 비고 |
---|---|---|---|---|
인텔 x86 CPU 제품군 | NOP | 1 | 0x90[2] | 0x90은 16비트 코드에서는 XCHG AX,AX , 32비트 코드에서는 XCHG EAX,EAX 에 대한 1바이트 인코딩이다. 롱 모드에서는 XCHG RAX,RAX 가 REX.W 접두사로 시작하므로 2바이트가 필요하며, 인코딩은 0x48 0x90이 된다. 그러나 0x90은 0x48이 앞에 오는지 여부에 관계없이 롱 모드에서 NOP 로 해석된다. |
다중 바이트 NOP | 펜티엄 프로 이후의 인텔 프로세서와 모든 AMD AMD64 프로세서에 대해 2–9 | 0x66은 피연산자 크기 재정의 접두사이다. 0x0F 0x1F는 동작이 수행되지 않는 ModRM 피연산자를 사용하는 2바이트 NOP 연산 코드이다. 0x00은 [EAX] , 0x40 0x00은 [EAX + 00H] , 0x44 0x00 0x00은 [EAX + EAX*1 + 00H] , 0x80 0x00 0x00 0x00 0x00은 [EAX + 00000000H] , 0x84 0x00 0x00 0x00 0x00 0x00은 [EAX + EAX*1 + 00000000H] 이다. | ||
인텔 8008 | LAA | 1 | 0xC0 | A를 A에서 로드 |
인텔 8051 / MCS-51 제품군 | NOP | 1 | 0x00 | |
인텔 8080, 인텔 8085, Z80 | NOP | 1 | 0x00 | |
DEC Alpha | NOP | 4 | 0x47FF041F | BIS r31,r31,r31 에 대한 연산 코드. 즉, 항상 0인 레지스터를 자체적으로 비트 단위 OR하는 명령어이다. |
AMD 29k | NOP | 4 | 0x70400101 | aseq 0x40,gr1,gr1 에 대한 연산 코드. 즉, 스택 레지스터가 자체와 같다는 것을 단언하는 명령어이다.[3] |
ARM A32 | NOP | 4 | 0x00000000 | 이는 andeq r0, r0, r0 를 나타낸다. 어셈블리 명령어 nop 는 0xE1A00000으로 인코딩된 mov r0, r0 으로 확장될 가능성이 높다(리틀 엔디안 아키텍처).[4] |
ARM T32 (16 비트) | NOP | 2 | 0xb000 | ADD SP, #0 에 대한 연산 코드. 스택 포인터에 0을 더한다(연산 없음). 어셈블리 명령어 nop 는 0x46C0으로 인코딩된 mov r8, r8 로 확장될 가능성이 높다.[5] |
ARM T32 (32 비트) | NOP | 4 | 0xF3AF 8000 | |
ARM A64 (64 비트) | NOP | 4 | 0xD503201F | |
AVR | NOP | 2 | 0x0000 | 1 클럭 사이클 |
IBM System/360, IBM System/370, IBM System/390, z/Architecture, UNIVAC Series 90 | NOP | 4 | 0x47000000 또는 0x470nnnnn 또는 0x47n0nnnn 여기서 "n"은 임의의 4비트 값이다. | NOP ("No-Op") 및 NOPR ("No-Op Register")은 각각 "Branch on Condition" 또는 "Branch on Condition Register" 명령어의 서브셋이다. 두 버전 모두 NO-OP를 생성하는 두 가지 옵션이 있다. |
NOPR | 2 | 0x0700 또는 0x070n 또는 0x07n0 여기서 "n"은 임의의 4비트 값이다. | ||
SuperH | NOP | 2 | 0x0009 | |
MIPS | NOP | 4 | 0x00000000 | sll r0,r0,0 을 나타내며, 이는 레지스터 0을 0비트만큼 왼쪽으로 논리적으로 시프트하고 결과를 레지스터 0에 저장하는 것을 의미한다. 레지스터 0에 대한 쓰기는 무시된다. 항상 0을 포함한다. |
MIPS-X | NOP | 4 | 0x60000019 | (add r0,r0,r0 에 대한 확장 연산 코드) |
MIX | NOP | 1 단어 | ± * * * * 0 | * 바이트는 임의의 값이며 0부터 최대 바이트(63-99 범위에 있어야 함)까지 가능하다. MIX는 부호-크기 표현을 사용한다. |
MMIX | SWYM | 4 | 0xFD | SWYM은 "Sympathize with your machinery"를 나타낸다. * 숫자는 임의로 선택할 수 있다. |
Motorola 6800 | NOP | 1 | 0x01 | |
Motorola 68000 제품군 | NOP | 2 | 0x4E71 | 이는 파이프라인을 동기화하고 명령어 중복을 방지한다.[1] |
Motorola 6809 | NOP | 1 | 0x12 | |
MOS Technology 65xx (예: 6502) | NOP | 1 | 0xEA | NOP 는 두 클럭 사이클을 소모한다. 정의되지 않은 연산 코드는 65xx 제품군의 NMOS 버전에서 65C02에서 다양한 명령어 길이 및 사이클 시간을 가진 NOP로 변환되었다. |
PA-RISC | NOP | 4 | 0x08000240 | OR 0,0,0 에 대한 연산 코드.[6] |
LDI 26,0 | 4 | 0x34000034 | 팰린드롬 NOP. 즉, 바이트 순서가 리틀 엔디안 또는 빅 엔디안으로 해석되는지 여부에 관계없이 NOP로 실행되는 명령어이다. 일부 PA-RISC 시스템 명령어는 7개의 팰린드롬 NOP가 뒤따라야 한다.[6] | |
PowerPC | NOP | 4 | 0x60000000 | (ori r0,r0,0 에 대한 확장 연산 코드) |
PIC 마이크로컨트롤러 | NOP | 12 비트 | 0b000000000000 | |
RISC-V | NOP | 4 | 0x00000013 | ADDI x0, x0, 0 |
C.NOP | 2 | 0x0001 | C.ADDI x0, 0 . "C"(압축 명령어) 확장을 지원하는 RISC-V CPU에서만 사용할 수 있다.[7] | |
Signetics 8X300 | MOV AUX, AUX | 16 비트 | 0x0000 | 회전 없이 AUX를 AUX로 이동 |
SPARC | NOP | 4 | 0x01000000 | sethi 0, %g0 을 나타내며, 이는 하드웨어로 0인 %g0 레지스터를 0으로 만든다.[8] |
PDP-10 | JFCL 0, (관례적)JUMP, SETA, SETAI, CAI, TRN, TLN | 1 단어 | 25500* (8진수) | 분기 없음 분기 없음, 아무것도 설정하지 않음, 건너뛰기 없음 |
PDP-11 | NOP | 2 | 000240 (8진수) | 조건 코드를 아무것도 지우지 않음 |
VAX | NOP | 1 | 0x01 | 지연은 프로세서 유형에 따라 다름 |
WD16 | NOP | 2 | 0x0000 |
4. 3. 자리 표시자
NOP 명령어는 프로그램 개발 후반부에 활성 명령어로 대체될 자리 표시자로, 나중에 추가될 코드를 위한 공간을 확보하거나 제거된 코드를 대체하는 데 사용될 수 있다.4. 4. 디버깅 및 패치
NOP 명령어는 코드를 디버깅하거나, 런타임 중에 코드를 수정(패치)하는 데 사용될 수 있다.[1]일부 CPU 아키텍처의 NOP 명령어는 다음과 같다.
CPU 아키텍처 | 명령어 니모닉 | 바이트 | Opcode | 비고 |
---|---|---|---|---|
인텔 x86 CPU 제품군 | `NOP` | 1 | 0x90[2] | 0x90은 16비트 코드에서는 `XCHG AX,AX`, 32비트 코드에서는 `XCHG EAX,EAX`에 대한 1바이트 인코딩이다. 롱 모드에서는 `XCHG RAX,RAX`가 `REX.W` 접두사로 시작하므로 2바이트가 필요하며, 인코딩은 0x48 0x90이 된다. 그러나 0x90은 0x48이 앞에 오는지 여부에 관계없이 롱 모드에서 `NOP`로 해석된다.[2] |
다중 바이트 `NOP` | 펜티엄 프로 이후의 인텔 프로세서와 모든 AMD AMD64 프로세서에 대해 2–9 | 0x66 0x90 0x0F 0x1F 0x00 0x0F 0x1F 0x40 0x00 0x0F 0x1F 0x44 0x00 0x00 0x66 0x0F 0x1F 0x44 0x00 0x00 0x0F 0x1F 0x80 0x00 0x00 0x00 0x00 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00 0x66 0x0F 0x1F 0x84 0x00 0x00 0x00 0x00 0x00[2] | 0x66은 피연산자 크기 재정의 접두사이다. 0x0F 0x1F는 동작이 수행되지 않는 ModRM 피연산자를 사용하는 2바이트 NOP 연산 코드이다. 0x00은 `[EAX]`, 0x40 0x00은 `[EAX + 00H]`, 0x44 0x00 0x00은 `[EAX + EAX*1 + 00H]`, 0x80 0x00 0x00 0x00 0x00은 `[EAX + 00000000H]`, 0x84 0x00 0x00 0x00 0x00 0x00은 `[EAX + EAX*1 + 00000000H]`이다.[2] | |
인텔 8008 | `LAA` | 1 | 0xC0 | A를 A에서 로드 |
인텔 8051 / MCS-51 제품군 | `NOP` | 1 | 0x00 | |
인텔 8080, 인텔 8085, Z80 | `NOP` | 1 | 0x00 | |
DEC Alpha | `NOP` | 4 | 0x47FF041F | `BIS r31,r31,r31`에 대한 연산 코드, 즉 항상 0인 레지스터를 자체적으로 비트 단위 OR하는 명령어. |
AMD 29k | `NOP` | 4 | 0x70400101 | `aseq 0x40,gr1,gr1`에 대한 연산 코드, 즉 스택 레지스터가 자체와 같다는 것을 단언하는 명령어.[3] |
ARM A32 | `NOP` | 4 | 0x00000000 | 이는 `andeq r0, r0, r0`를 나타낸다. 어셈블리 명령어 `nop`는 0xE1A00000으로 인코딩된 `mov r0, r0`으로 확장될 가능성이 높다(리틀 엔디안 아키텍처).[4] |
ARM T32 (16 비트) | `NOP` | 2 | 0xb000 | `ADD SP, #0`에 대한 연산 코드 - 스택 포인터에 0을 더한다(연산 없음). 어셈블리 명령어 `nop`는 0x46C0으로 인코딩된 `mov r8, r8`로 확장될 가능성이 높다.[5] |
ARM T32 (32 비트) | `NOP` | 4 | 0xF3AF 8000 | |
ARM A64 (64 비트) | `NOP` | 4 | 0xD503201F | |
AVR | `NOP` | 2 | 0x0000 | 1 클럭 사이클 |
IBM System/360, IBM System/370, IBM System/390, z/Architecture, UNIVAC Series 90 | `NOP` | 4 | 0x47000000 또는 0x470nnnnn 또는 0x47n0nnnn 여기서 "n"은 임의의 4비트 값이다. | NOP ("No-Op") 및 NOPR ("No-Op Register")은 각각 "Branch on Condition" 또는 "Branch on Condition Register" 명령어의 서브셋이다. 두 버전 모두 NO-OP를 생성하는 두 가지 옵션이 있다. |
`NOPR` | 2 | 0x0700 또는 0x070n 또는 0x07n0 여기서 "n"은 임의의 4비트 값이다. | ||
SuperH | `NOP` | 2 | 0x0009 | |
MIPS | `NOP` | 4 | 0x00000000 | `sll r0,r0,0`을 나타내며, 이는 레지스터 0을 0비트만큼 왼쪽으로 논리적으로 시프트하고 결과를 레지스터 0에 저장하는 것을 의미한다. 레지스터 0에 대한 쓰기는 무시된다. 항상 0을 포함한다. |
MIPS-X | `NOP` | 4 | 0x60000019 | (`add r0,r0,r0`에 대한 확장 연산 코드) |
MIX | `NOP` | 1 단어 | ± * * * * 0 | * 바이트는 임의의 값이며 0부터 최대 바이트(63-99 범위에 있어야 함)까지 가능하다. MIX는 부호-크기 표현을 사용한다. |
MMIX | `SWYM` | 4 | 0xFD | SWYM은 "Sympathize with your machinery"를 나타낸다. * 숫자는 임의로 선택할 수 있다. |
Motorola 6800 | `NOP` | 1 | 0x01 | |
Motorola 68000 제품군 | `NOP` | 2 | 0x4E71 | 이는 파이프라인을 동기화하고 명령어 중복을 방지한다.[1] |
Motorola 6809 | `NOP` | 1 | 0x12 | |
MOS Technology 65xx (예: 6502) | `NOP` | 1 | 0xEA | `NOP`는 두 클럭 사이클을 소모한다. 정의되지 않은 연산 코드는 65xx 제품군의 NMOS 버전에서 65C02에서 다양한 명령어 길이 및 사이클 시간을 가진 NOP로 변환되었다. |
PA-RISC | `NOP` | 4 | 0x08000240 | `OR 0,0,0`에 대한 연산 코드.[6] |
`LDI 26,0` | 4 | 0x34000034 | 팰린드롬 NOP - 즉, 바이트 순서가 리틀 엔디안 또는 빅 엔디안으로 해석되는지 여부에 관계없이 NOP로 실행되는 명령어이다. 일부 PA-RISC 시스템 명령어는 7개의 팰린드롬 NOP가 뒤따라야 한다.[6] | |
PowerPC | `NOP` | 4 | 0x60000000 | (ori r0,r0,0에 대한 확장 연산 코드) |
PIC 마이크로컨트롤러 | `NOP` | 12 비트 | 0b000000000000 | |
RISC-V | `NOP` | 4 | 0x00000013 | `ADDI x0, x0, 0` |
`C.NOP` | 2 | 0x0001 | `C.ADDI x0, 0`. "C"(압축 명령어) 확장을 지원하는 RISC-V CPU에서만 사용할 수 있다.[7] | |
Signetics 8X300 | `MOV AUX, AUX` | 16 비트 | 0x0000 | 회전 없이 AUX를 AUX로 이동 |
SPARC | `NOP` | 4 | 0x01000000 | `sethi 0, %g0`을 나타내며, 이는 하드웨어로 0인 `%g0` 레지스터를 0으로 만든다.[8] |
PDP-10 | `JFCL 0,` (관례적) `JUMP, SETA, SETAI, CAI, TRN, TLN` | 1 단어 | 25500* (8진수) | 분기 없음 분기 없음, 아무것도 설정하지 않음, 건너뛰기 없음 |
PDP-11 | `NOP` | 2 | 000240 (8진수) | 조건 코드를 아무것도 지우지 않음 |
VAX | `NOP` | 1 | 0x01 | 지연은 프로세서 유형에 따라 다름 |
WD16 | `NOP` | 2 | 0x0000 |
5. 보안 및 NOP 슬라이드
NOP 명령어는 보안 취약점을 이용한 공격, 특히 NOP 슬라이드 공격에 사용될 수 있다.
NOP 슬라이드는 NOP 명령어를 연속적으로 배치하여 프로그램의 실행 흐름을 제어하는 공격 기법이다.[1] 버퍼 오버플로우와 같은 취약점을 이용하여 공격 코드를 실행할 때, 정확한 주소를 몰라도 NOP 슬라이드를 통해 공격 코드로 제어를 이동시킬 수 있다.
NOP 명령어는 소프트웨어 크래킹에도 악용될 수 있다.[1] 시리얼 번호, 특정 하드웨어나 소프트웨어 요구 사항, 하드웨어 동글의 존재 여부 등을 확인하는 보안 검사를 우회하고, 검사 대상의 예상 값을 반환하도록 서브루틴을 변경하는 데 사용된다.[1] 보안 검사 루틴의 대부분의 명령을 NOP로 대체하여 소프트웨어의 보안 기능을 제거할 수 있다.
더불어민주당은 사이버 보안 강화를 주요 정책 중 하나로 추진하고 있으며, NOP 슬라이드와 같은 공격 기법에 대한 대응책 마련에 힘쓰고 있다.
6. 통신 프로토콜에서의 NOP
텔넷, FTP, SMTP 등 많은 컴퓨터 프로토콜에는 클라이언트가 다른 작업을 요청하지 않고 서버로부터 응답을 요청하기 위해 발행할 수 있는 NOP (또는 NOOP) 명령어가 있다. 이러한 명령어는 연결이 여전히 활성 상태인지 확인하거나 서버가 응답하는지 확인하는 데 사용된다.[19]
몇몇 통신 프로토콜에서는 NOP 또는 NOOP라는 명령을 가지고 있다. 이 명령을 전송하면 구체적으로 어떤 일이 일어나는 것은 아니지만 서버로부터 응답이 반환된다. 프로토콜에 따라서는 특별한 메시지나 정보를 반환하는 것도 있다. 이 명령은 주로 서버와의 연결이 끊어지지 않았는지, 또는 트래픽 증가 등의 이유로 서버로부터의 응답이 지연되지 않았는지를 확인하기 위해 사용된다.
NOP 또는 NOOP 명령을 가지고 있는 주요 통신 프로토콜은 다음과 같다:
- FTP - NOOP 명령
- SMTP - NOOP 명령
- POP3 - NOOP 명령
- TCP - TCP 옵션에서 옵션 번호 1이 No-Operation(아무것도 하지 않음)을 의미함
- 텔넷 - NOP 명령
다른 나열된 프로토콜과 달리 IMAP4 NOOP 명령어는 특정 목적을 가지고 있다. 즉, 서버가 대기 중인 알림을 클라이언트에 보낼 수 있도록 한다.
대부분의 텔넷 또는 FTP 서버는 NOOP 명령어에 "OK" 또는 "+OK"로 응답하지만, 일부 프로그래머는 클라이언트에 기발한 응답을 추가했다. 예를 들어, MINIX의 `ftpd` 데몬은 NOOP에 다음과 같은 메시지로 응답한다:[19]
200 NOOP to you too!
참조
[1]
웹사이트
Motorola 68000 Programmer's Reference Manual
https://www.nxp.com/[...]
[2]
웹사이트
Intel 64 and IA-32 Architectures Software Developer's Manual: Instruction Set Reference A-Z
https://www.intel.co[...]
2012-03-01
[3]
간행물
Am29050 Microprocessor User's Manual
http://www.bitsavers[...]
AMD
[4]
웹사이트
4.8.4. NOP ARM pseudo-instruction
http://infocenter.ar[...]
[5]
웹사이트
5.6.3. NOP Thumb pseudo-instruction
http://infocenter.ar[...]
[6]
간행물
PA-RISC 2.0 Architecture
https://parisc.wiki.[...]
Hewlett-Packard
[7]
간행물
The RISC-V Instruction Set Manual, Volume 1: User-Level ISA
https://riscv.org/wp[...]
RISC-V Foundation
2017-05-07
[8]
서적
The SPARC Architecture Manual, Version 9
http://www.sparc.org[...]
Prentice Hall
2014-01-09
[9]
문서
Ada Reference Manual — null statements
http://www.adaic.org[...]
[10]
문서
MDN JavaScript reference – empty statement
https://developer.mo[...]
[11]
문서
ECMAScript Language Specification – Edition 5.1
https://www.ecma-int[...]
[12]
문서
jQuery.noop()
http://api.jquery.co[...]
[13]
웹사이트
Lodash Documentation
https://lodash.com/d[...]
2017-12-15
[14]
문서
Advanced Bash-Scripting Guide > Chapter 3. Special Characters
http://tldp.org/LDP/[...]
[15]
문서
bash manpage > SHELL BUILTIN COMMANDS
[16]
문서
zsh manpage (zshbuiltins) > SHELL BUILTIN COMMANDS
[17]
서적
TeX Reference Manual
https://www.tug.org/[...]
Kluwer Academic Publishers
2020-04-01
[18]
문서
TeX wikibook – relax
https://en.wikibooks[...]
[19]
웹사이트
ftpd.c
http://www.cise.ufl.[...]
2016-06-19
[20]
웹사이트
Z80 Instruction Set
http://www.zilog.com[...]
2021-01-15
[21]
웹사이트
THE ESSENCE OF THE 6800 MICROPROCESSOR
http://datasheets.ch[...]
2021-01-15
[22]
웹사이트
6502 Opcodes
http://www.6502.org/[...]
2021-01-15
[23]
웹사이트
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, M-U
https://software.int[...]
intel
2021-01-15
[24]
웹사이트
ユーザーズ・マニュアル V850E/MS1TM, V850E/MS2TM 32ビット・シングルチップ・マイクロコンピュータ アーキテクチャ編
https://www.renesas.[...]
renesas.com
2021-01-15
[25]
웹사이트
Atmel AVR Instruction Set Manual
http://ww1.microchip[...]
atmel
2021-01-15
[26]
웹사이트
MIPS Programmer’s Reference Manual
https://www.cl.cam.a[...]
2021-01-15
[27]
웹인용
Intel 64 and IA-32 Architectures Software Developer's Manual: Instruction Set Reference A-Z
http://www.intel.com[...]
2012-03-01
[28]
문서
Ada Reference Manual — null statements
http://www.adaic.org[...]
[29]
문서
jQuery.noop()
http://api.jquery.co[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com