NOP(코드)

NOP (code)

컴퓨터 과학에서 NOP, no-op 또는 NOOP ("no op"으로 발음됨)는 기계어 명령 및 어셈블리 언어 니모닉, 프로그래밍 언어 문 또는 아무 것도 하지 않는 컴퓨터 프로토콜 명령어입니다.

기계어 명령어

일부 컴퓨터 명령어 세트는 프로그래머가 접근할 수 있는 레지스터, 상태 플래그 또는 메모리의 상태를 변경하지 않는 것을 목적으로 하는 명령을 포함합니다.클럭 사이클의 개수가 명확하게 정의되어 있는 경우가 많습니다.다른 명령어 세트에서는 명시적인 NOP 명령은 없지만 어셈블리 언어 니모닉 NOP는 NOP로 동작하는 명령을 나타냅니다(예: SPARC,sethi 0, %g0.

NOP는 메모리에 액세스하지 마십시오.메모리 장애 또는 페이지 장애가 발생할 수 있습니다.

NOP는 타이밍 목적, 메모리 정렬 강제, 위험 방지, 분기 지연 슬롯 점유, 점프와 같은 기존 명령의 보이드 렌더링, 실행 명령의 타깃 또는 나중에 프로그램 개발에서 활성 명령으로 대체되는 플레이스 홀더로 가장 일반적으로 사용됩니다(또는 제거된 명령의 대체).문제가 있거나 시간이 많이 소요됩니다).경우에 따라서는 NOP에 의해 약간의 부작용이 발생할 수 있습니다.예를 들어 Motorola 68000 시리즈의 프로세서에서는 NOP opcode에 의해 [1]파이프라인이 동기화됩니다.

일부 CPU 아키텍처의 NOP 명령어는 다음과 같습니다.

CPU 아키텍처 명령 니모닉 바이트 수 오퍼코드 메모들
인텔 x86 CPU 패밀리 NOP 1 (i686 및 x86-64의 경우)1 ~ 9 0x90[2] 0x90 디코딩 대상xchg eax, eaxlong 모드를 제외한 모든 모드에서 opcode 0x90은 여전히 영향을 주지 않습니다.긴 인코딩은 인텔의 매뉴얼에 기재되어 있습니다.
인텔 8051 / MCS-51 패밀리 NOP 1 0x00
ARM A32 NOP 4 0x00000000 이것은 의 약자다andeq r0, r0, r0·조립설명서nop로 확장될 가능성이 높다mov r0, r00xE1로 인코딩되어 있습니다.A00000(리틀엔디안 아키텍처).[3]
ARM T32(16비트) NOP 2 0xb000 조작 코드:ADD SP, #0- 스택 포인터에 0을 추가합니다(No operation).조립 지침nop로 확장될 가능성이 높다mov r8, r80x46C0으로 [4]부호화되어 있습니다.
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, 0x440nnn 또는 0x47nnnnn. 여기서 "n"은 임의의 4비트 값입니다. NOP("No-Op") 및 NOPR("No-Op Register")는 각각 "조건별 분기" 또는 "조건별 분기 레지스터" 명령의 하위 집합입니다. 두 버전 모두 NO-OP를 생성하기 위한 두 가지 옵션이 있습니다.

NOP 명령과 NOPR 명령의 경우, 두 번째 바이트의 첫 번째 0은 "마스크" 값입니다. "마스크", "같지 않음", "하이", "로우" 등과 같은 테스트 조건입니다.마스크가 0인 경우 분기는 발생하지 않습니다.

NOPR 명령의 경우, 두 번째 바이트의 두 번째 값은 분기하는 레지스터입니다.레지스터 0을 선택하면 마스크 값에 관계없이 분기가 발생하지 않습니다.따라서 두 번째 바이트의 두 값 중 하나가 0일 경우 분기는 발생하지 않습니다.

NOP 명령의 경우, 두 번째 바이트의 두 번째 값은 결합된 기본 레지스터, 변위 레지스터 및 오프셋 주소의 "기본" 레지스터입니다.베이스 레지스터도 0인 경우, 변위 레지스터의 값이나 변위 주소의 값에 관계없이 브랜치는 취득되지 않습니다.

NOPR 2 0x0700, 0x070n 또는 0x07n0. 여기서 "n"은 임의의 4비트 값입니다.
슈퍼H NOP 2 0x0009
MIPS NOP 4 0x00000000 의 약자sll r0,r0,0즉, 레지스터 0을 논리적으로 왼쪽으로 이동하고 결과를 레지스터 0에 저장합니다.레지스터 0 에의 기입은 무시됩니다.항상 0 이 포함됩니다.
MIPS-X NOP 4 0x60000019 (opcode는 다음과 같습니다).add r0,r0,r0)
혼재 NOP 한 단어 ± * * * * 0 * 바이트는 임의이며 0 ~ 최대 바이트(63 ~99 의 범위에서 필요)를 지정할 수 있습니다.MIX는 부호 크기 표현을 사용합니다.
MMIX SWYM 4 0 x FD ********** SWYM은 "Sympathize with your machine"의 약자입니다.* 자릿수는 임의로 선택할 수 있습니다.
Motorola 68000 패밀리 NOP 2 0x4E71 이렇게 하면 파이프라인이 동기화되어 명령이 [1]중복되지 않습니다.
모토로라 6809 NOP 1 0x12
MOS 테크놀로지 65xx (예: 6502) NOP 1 0xEA NOP는 2개의 클럭사이클을 소비합니다65xx 패밀리의 NMOS 버전에서 정의되지 않은 opcode65C02에서 명령 길이와 사이클 시간이 다른 NOP로 변환되었습니다.
Power PC NOP 4 0x60000000 (opcode는 다음과 같습니다).ori r0,r0,0)
PIC 마이크로컨트롤러 NOP 12비트 0b000000000000 MOVW 0,W
RISC-V NOP 4 0x00000013 ADDI x0, x0, 0
SPARC NOP 4 0x01000000 의 약자sethi 0, %g0유선 연결에서 제로 연결로%g0등록하다[5]
Z80 NOP 1 0x00 효과가 없는(및 같은 타이밍) 다른 지시사항이 있습니다. LD A, A,LD B, B기타.
PDP-10 JFCL 0,(기존)
JUMP, SETA, SETAI, CAI, TRN, TLN
한 단어 25500****** (8진수) 점프 안 함
점프하지 않고, 아무것도 설정하지 않고, 건너뛰지 않는다.
PDP-11 NOP 16비트 000240 (8진수) 상태 코드를 모두 지웁니다.
VAX NOP 1 0x01 지연은 프로세서 유형에 따라 다릅니다.

하드웨어 설계의 관점에서 보면, 버스의 매핑되지 않은 영역은 종종 0을 반환하도록 설계되어 있습니다.NOP 슬라이드 동작이 바람직한 경우가 많기 때문에 NOP는 모두0의 opcode로 부호화하도록 편견을 줍니다.

코드

프로그래밍 언어 문장의 함수 또는 시퀀스는 NOP 또는 null 문(영향이 없는 경우)입니다.특정 컨텍스트의 일부 언어 구문에서는 null 문이 필요할 수 있습니다.

아다

에이다에서는null스테이트먼트는 NOP로 [6]기능합니다.구문에서는 제어문 또는 함수가 비어 있는 것이 금지되어 있기 때문에null스테이트먼트를 사용하여 액션이 필요 없는 것을 지정해야 합니다.(따라서 프로그래머가 스테이트먼트의 시퀀스를 쓰는 것을 잊으면 프로그램은 컴파일 할 수 없게 됩니다.

C 및 파생상품

C에서 가장 단순한 NOP 문은 늘스테이트먼트입니다.늘스테이트먼트는스테이트먼트가필요한컨텍스트의 세미콜론일 뿐입니다.

;

빈 블록(복합문)도 NOP이므로 읽기 쉬울 수 있습니다.

{}

함수의 본문과 같은 경우에 따라 블록을 사용해야 하지만 이 블록은 비워 둘 수 있습니다.C에서 문은 비워 둘 수 없습니다.단순한 문은 ;(semicolon)로 끝나야 하며 복합문은 {}(괄호)로 둘러싸여 있습니다.이것 자체에는 세미콜론이 필요 없습니다.따라서 문장이 문법적으로 필요한 상황에서는 이러한 null 문을 사용할 수 있습니다.

null 문장은 그 자체로는 쓸모가 없지만, 예를 들어 루프의 문맥 내에서 보다 넓은 문맥에서 구문적으로 사용할 수 있습니다.

  하는 동안에 (취득하다() != '\n') {} 

또는,

  하는 동안에 (취득하다() != '\n')       ; 

또는 보다 간결하게:

  하는 동안에 (취득하다() != '\n'); 

(세미콜론은 보통 줄의 끝 괄호 뒤에 있는 함수 호출 명령의 끝을 나타내기 때문에 마지막 형식은 혼란스러울 수 있으므로 컴파일러 또는 컴파일러 옵션과 함께 경고를 생성합니다).

위의 코드는 \n(newline) 문자를 반환할 때까지 함수 getchar()를 호출하여 기본적으로 표준 입력의 현재 읽기 위치를 다음 줄의 선두로 빠르게 전달합니다.

포트란

Fortran에서는CONTINUE스테이트먼트는 DO 루프의 마지막 스테이트먼트와 같은 일부 컨텍스트에서 사용됩니다.다만, 어느 장소에서도 사용할 수 있어 기능은 없습니다.

자바스크립트

JavaScript 언어에는 NOP 문이 내장되어 있지 않습니다.다음과 같은 많은 구현이 가능합니다.

  • 를 사용합니다.; [7] 스테이트먼트 또는{}C 및 파생상품 예시와 동일한 방법으로 빈 블록 문;
  • 를 사용합니다.undefined또는nullexpression을 완전한 스테이트먼트(expression 스테이트먼트)로 지정합니다.

기능이 필요한 경우 대안은 다음과 같습니다.

  • 를 사용합니다.Function.prototype()임의의 인수를 받아들여 반환하는 삽입 함수undefined;[8]
  • 서드파티 라이브러리에서 사용할 수 있는 NOP 기능을 사용합니다.아래를 참조해 주십시오.
  • 다음 예시와 같이 커스텀 NOP 함수를 정의합니다(ES6 화살표 함수 구문 사용).
컨스턴트 누프 = () => {}; 

각도 JS

앵귤러JS 프레임워크는 작업을 수행하지 않는 angular.noop 함수를 제공합니다.

j쿼리

jQuery 라이브러리는 다음 기능을 제공합니다.jQuery.noop()아무 것도 [9]안 해요

로다시

Lodash 라이브러리는 다음과 같은 기능을 제공합니다._.noop()정의되지 않은 상태로 반환되며 [10]아무 것도 수행되지 않습니다.

파스칼

C와 마찬가지로 Pascal에서 null 문장으로 사용할 수 있습니다.실제로 언어 지정에 따라 BEGIN/END 블록에서는 END 문 앞에 세미콜론이 옵션이기 때문에 사용되는 세미콜론은 불필요합니다.

또한 블록은 다음과 같이 구성되어 있습니다. BEGIN END;다른 BEGIN/END 블록 안에 배치되어도 아무런 작업이 없음을 나타내는 자리 표시자로 사용할 수 있습니다.

파이썬

Python 프로그래밍 언어에는 실행 시 아무런 영향을 미치지 않는 문장이 있으므로 NOP 역할을 합니다.Python의 들여쓰기 구분 구문 때문에 올바른 구문을 보장하기 위해 주로 사용됩니다. 예를 들어 클래스 정의를 위한 구문은 클래스 로직이 포함된 들여쓰기된 블록을 필요로 합니다.pass비어 있어야 할 때.

셸 스크립트(bash, zsh 등)

':' [ colon ]명령어는 'NOP'(do-nothing 조작)와 유사한 효과를 가진 셸 내장 명령어입니다.특수 파라미터 $?(마지막 명령어 종료 상태)를 0으로 변경하기 때문에 기술적으로 NOP는 아닙니다.이는 "true"라는 셸에 내장된 동의어로 간주될 수 있으며 종료 상태는 true([11][12][13]0)입니다.

TeX 매크로 언어(ConTeXt, LaTeX 등)

TeX 인쇄 시스템의 매크로 언어에는 다음과 같은 기능이 있습니다.\relax명령어를 [14]입력합니다.이 명령어는 그 자체로는 아무것도 하지 않지만 직전 명령어가 후속 [15]토큰을 해석하는 것을 방지하기 위해 사용할 수 있습니다.

NOP 프로토콜 명령어

텔넷과 같은 많은 컴퓨터 프로토콜에는 클라이언트가 다른 작업을 요청하지 않고 서버에 응답을 요청하기 위해 실행할 수 있는 NOP 명령이 포함되어 있습니다.이러한 명령어를 사용하여 연결이 아직 활성화되어 있는지 또는 서버가 응답하고 있는지 확인할 수 있습니다.NOP 명령은 다음 프로토콜의 일부입니다(이것은 부분 목록입니다).

목록에 있는 다른 프로토콜과 달리 IMAP4 NOOP 명령에는 특정 목적이 있습니다. 즉, 서버는 보류 중인 알림을 클라이언트에 전송할 수 있습니다.

대부분의 telnet 또는 FTP 서버는 NOP 명령에 "OK" 또는 "+OK"로 응답하지만 일부 프로그래머는 클라이언트에 대해 기발한 응답을 추가했습니다.예를 들어,ftpdMINIX의 데몬은 NOP에 다음과 같은 [16]메시지로 응답합니다.

도 200NOOP! 

금이 가다

NOP는 시리얼 번호, 특정 하드웨어 또는 소프트웨어 요건, 하드웨어 동글의 유무 [citation needed]등을 체크하는 소프트웨어를 크래킹할 때 자주 발생합니다.이 프로세스는 보안 검사를 바이패스하도록 함수와 서브루틴을 변경하고 대신 검사 대상 예상 값을 반환합니다.보안 검사 루틴의 명령어는 대부분 사용되지 않으므로 NOP로 대체되므로 바이너리에서 이어지는 모든 명령어의 위치를 변경하지 않고 소프트웨어의 보안 기능을 제거할 수 있습니다.

보안 악용

NOP opcode는 NOP 슬라이드를 형성하는 데 사용할 수 있습니다. NOP 슬라이드는 명령 포인터의 정확한 값이 결정되지 않은 경우(예: 버퍼 오버플로로 인해 스택 상의 함수의 리턴 주소가 덮어쓰게 되는 경우) 코드를 실행할 수 있습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b "Motorola 68000 Programmer's Reference Manual" (PDF).
  2. ^ "Intel 64 and IA-32 Architectures Software Developer's Manual: Instruction Set Reference A-Z" (PDF). Retrieved 2012-03-01.
  3. ^ "4.8.4. NOP ARM pseudo-instruction". RealView Compilation Tools for BREW Assembler Guide.
  4. ^ "5.6.3. NOP Thumb pseudo-instruction". RealView Compilation Tools for BREW Assembler Guide.
  5. ^ Weaver, D. L.; Germond, T., eds. (1994). The SPARC Architecture Manual, Version 9 (PDF). SPARC International, Inc. Prentice Hall. ISBN 0-13-825001-4. Archived from the original (PDF) on 2012-01-18. Retrieved 2014-01-09. Note that NOP is a special case of the SETHI instruction, with imm22 = 0 and rd = 0.
  6. ^ Ada Reference Manual :특수문입니다."null_statement 실행은 아무런 영향을 미치지 않습니다."
  7. ^ MDN JavaScript 레퍼런스– 빈 스테이트먼트빈 문은 세미콜론입니다.;)는 JavaScript 구문에 문이 필요한 경우에도 문이 실행되지 않음을 나타냅니다."
  8. ^ ECMAScript 언어 사양– Edition 5.1 – Function Prototype 객체의 속성
  9. ^ jQuery API 문서의 jQuery.noop()
  10. ^ "Lodash Documentation". lodash.com. Retrieved 2017-12-15.
  11. ^ Advanced Bash-Scripting Guide > Chapter 3 。특수 문자
  12. ^ bash manpage > SHEL BUILTIN 명령어
  13. ^ zsh manpage (zsh builtins)> SHEL BUILTIN 명령어
  14. ^ Bausum, David (2002). "TeX Primitive Control Sequences". TeX Reference Manual. Kluwer Academic Publishers. Retrieved 1 April 2020. According to The TeXbook, 'TeX does nothing' when it encounters \relax. Actually, \relax may tell TeX, 'This is the end of what you've been doing'.
  15. ^ TeX Wikibook – 릴렉스
  16. ^ "ftpd.c". Retrieved 2016-06-19.