developer tip

"rep;

optionbox 2020. 10. 15. 07:43
반응형

"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 명령을 배치하는 것이 좋습니다.


명령어에 적용되지 않는 접두사는 무시됩니다. 그러나 향후 CPU는 해당 바이트 시퀀스를 사용하여 새 명령을 인코딩 할 수 있습니다. (예, x86 opcode 공간이 너무 제한되어 이와 같이 미친 짓을하므로 디코더가 복잡해집니다.)

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


x86 태그 위키 정보 페이지 : https://stackoverflow.com/tags/x86/info 에있는 Intel의 설명서 및 기타 유용한 항목에 대한 링크

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


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

참고 URL : https://stackoverflow.com/questions/7086220/what-does-rep-nop-mean-in-x86-assembly-is-it-the-same-as-the-pause-instru

반응형