[assembly] “rep; 아니,” x86 어셈블리에서 의미합니까? “일시 중지”지침과 동일합니까?

  • 무슨 rep; nop뜻이야?
  • pause지시 와 같은가요 ?
  • rep nop(세미콜론 제외) 와 동일 합니까?
  • 간단한 nop지시 와 다른 점은 무엇입니까 ?
  • AMD 및 Intel 프로세서에서 다르게 작동합니까?
  • (보너스)이 지침에 대한 공식 문서는 어디에 있습니까?

이 질문에 대한 동기

다른 질문 에 대한 의견에 대한 토론을 한 후 rep; nop;x86 (또는 x86-64) 어셈블리에서 의미하는 바를 모르겠다는 것을 깨달았습니다 . 또한 웹에서 좋은 설명을 찾을 수 없었습니다.

나는 이것이 “다음 명령 시간 반복”rep 을 의미하는 접두사라는 것을 알고 있습니다 (또는 적어도 이전 16 비트 x86 어셈블리에서는 그렇습니다). 이에 따라 위키 백과에서 요약 테이블 , 그것은 보인다 에만 사용할 수 있습니다 , , , , (하지만 어쩌면 이러한 제한은 새로운 프로세서에서 제거). 따라서 (세미콜론없이) 작업 시간을 반복 할 것이라고 생각 합니다.cxrepmovsstoscmpslodsscasrep nopnopcx

하지만 더 찾아 보니 더 혼란스러워졌습니다. 것으로 보인다 rep; noppause 정확히 같은 연산 코드에 매핑 하고, pause단지보다 약간 다른 동작이 있습니다 nop. 2005 년의 일부 오래된 메일에는 다음과 같은 내용이 있습니다.

  • “너무 많은 전력을 태우지 마십시오”
  • “2 바이트 인코딩만으로 ‘nop’와 동일합니다.”
  • “이는 인텔의 마법입니다. ‘아니지만 다른 HT 형제가 실행되도록 놔두세요’와 같습니다.”
  • “인텔에서는 일시 중지되고 Athlon에서는 빠른 패딩입니다.”

이렇게 다른 의견으로는 정확한 의미를 이해할 수 없었습니다.

다음 주석과 함께 Linux 커널 ( i386x86_64 모두에서 )에서 사용되고 있습니다. 동일한 주석과 함께 BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ 에서도 사용되고 있습니다.



답변

rep; nop실제로 pause명령어 (opcode F390) 와 동일합니다 . pause아직 명령어를 지원하지 않는 어셈블러에 사용될 수 있습니다 . 이전 프로세서에서 이것은 단순히 nop2 바이트 에서처럼 아무것도하지 않았습니다 . 하이퍼 스레딩을 지원하는 새 프로세서에서는 성능 향상을 위해 스핀 루프를 실행하고 있다는 것을 프로세서에 대한 힌트로 사용합니다. 에서 인텔의 명령 참조 :

스핀 대기 루프의 성능을 향상시킵니다. “스핀 대기 루프”를 실행할 때 Pentium 4 또는 Intel Xeon 프로세서는 가능한 메모리 순서 위반을 감지하기 때문에 루프를 종료 할 때 심각한 성능 저하를 겪습니다. PAUSE 명령어는 프로세서에 코드 시퀀스가 ​​스핀 대기 루프라는 힌트를 제공합니다. 프로세서는이 힌트를 사용하여 대부분의 상황에서 메모리 순서 위반을 방지하므로 프로세서 성능이 크게 향상됩니다. 이러한 이유로 모든 스핀 대기 루프에 PAUSE 명령을 배치하는 것이 좋습니다.


답변

rep nop= F3 90 =에 대한 인코딩 및 pause지원하지 않는 이전 CPU에서 디코딩하는 방법 pause.


접두사 ( lock명령어에 적용되지 않는 )는 실제로 기존 CPU에서 무시됩니다.

문서 rep에는 적용되지 않는 명령어와 함께 사용하는 것은 미래의 CPU가이를 새로운 명령어의 일부로 인식 할 수 있기 때문에 “예약되어 있으며 예측할 수없는 동작을 일으킬 수 있습니다”라고 말합니다 . 를 사용하여 특정 새 명령어 인코딩을 설정하면 f3 xx이전 CPU에서 실행되는 방식을 문서화합니다. (예, x86 opcode 공간이 너무 제한되어 이와 같이 미친 짓을하므로 디코더가 복잡해집니다.)

이 경우 역방향 compat을 깨지 않고 spinloops에서 사용할 수 있음을 의미합니다pause . 알지 못하는 오래된 CPU는 pauseIntel의 ISA ref 수동 입력에pause 의해 보장 된대로 해를 끼치 지 않고 NOP로 디코딩합니다 . 새로운 CPU에서는 절전 / HT 친화 성의 이점을 얻고 회전중인 메모리가 변경되고 회전 루프를 벗어날 때 메모리 정렬 오류를 피할 수 있습니다.


x86 태그 위키 정보 페이지 에있는 Intel의 설명서 및 기타 유용한 정보에 대한 링크

의미없는 rep접두사가 새 CPU에서 새 명령어가되는 또 다른 경우 lzcntF3 0F BD /r입니다. 그 명령 (자신의 CPUID의 LZCNT 기능 플래그 누락)를 지원하지 않는 CPU를, 그것은으로 디코딩 rep bsr과 동일하게 실행되는, bsr. 따라서 오래된 CPU에서는을 생성 32 - expected_result하고 입력이 0 일 때 정의되지 않습니다.

그러나 tzcntbsf컴파일러 수 있도록, 비 – 제로 입력과 같은 일을하고 사용 할 수 tzcnt가 대상 CPU가로 실행되도록 보장되지에도 tzcnt. AMD CPU는 빠르고 tzcnt느리며 bsfIntel에서는 둘 다 빠릅니다. 정확성이 중요하지 않은 한 (플래그 설정에 의존하지 않거나 입력 = 0의 경우 대상 동작을 수정하지 않은 상태로 두지 않는 경우)이를 tzcnt지원하는 CPU에서 디코딩 하는 것이 도움이됩니다.


rep다른 방식으로 디코딩하지 않는 무의미한 접두사 의 한 가지 경우 : rep ret“일반”CPU를 대상으로 할 때 gcc에서 기본적으로 사용됩니다 (예 : -march또는 로 특정 CPU를 대상으로 지정 -mtune하지 않고 AMD K8 또는 K10을 대상으로 지정하지 않음). 대부분의 Linux 배포판에서 대부분의 바이너리에 존재하기 때문에 rep ret다른 것으로 디코딩하는 CPU를 만들 수 ret있습니다. `rep ret`은 무엇을 의미합니까?를 참조하십시오 .


답변