- 무슨
rep; nop
뜻이야? pause
지시 와 같은가요 ?rep nop
(세미콜론 제외) 와 동일 합니까?- 간단한
nop
지시 와 다른 점은 무엇입니까 ? - AMD 및 Intel 프로세서에서 다르게 작동합니까?
- (보너스)이 지침에 대한 공식 문서는 어디에 있습니까?
이 질문에 대한 동기
다른 질문 에 대한 의견에 대한 토론을 한 후 rep; nop;
x86 (또는 x86-64) 어셈블리에서 의미하는 바를 모르겠다는 것을 깨달았습니다 . 또한 웹에서 좋은 설명을 찾을 수 없었습니다.
나는 이것이 “다음 명령 시간 반복”rep
을 의미하는 접두사라는 것을 알고 있습니다 (또는 적어도 이전 16 비트 x86 어셈블리에서는 그렇습니다). 이에 따라 위키 백과에서 요약 테이블 , 그것은 보인다 에만 사용할 수 있습니다 , , , , (하지만 어쩌면 이러한 제한은 새로운 프로세서에서 제거). 따라서 (세미콜론없이) 작업 시간을 반복 할 것이라고 생각 합니다.cx
rep
movs
stos
cmps
lods
scas
rep nop
nop
cx
하지만 더 찾아 보니 더 혼란스러워졌습니다. 것으로 보인다 rep; nop
와 pause
정확히 같은 연산 코드에 매핑 하고, pause
단지보다 약간 다른 동작이 있습니다 nop
. 2005 년의 일부 오래된 메일에는 다음과 같은 내용이 있습니다.
- “너무 많은 전력을 태우지 마십시오”
- “2 바이트 인코딩만으로 ‘nop’와 동일합니다.”
- “이는 인텔의 마법입니다. ‘아니지만 다른 HT 형제가 실행되도록 놔두세요’와 같습니다.”
- “인텔에서는 일시 중지되고 Athlon에서는 빠른 패딩입니다.”
이렇게 다른 의견으로는 정확한 의미를 이해할 수 없었습니다.
다음 주석과 함께 Linux 커널 ( i386 및 x86_64 모두에서 )에서 사용되고 있습니다. 동일한 주석과 함께 BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
에서도 사용되고 있습니다.
답변
rep; nop
실제로 pause
명령어 (opcode F390
) 와 동일합니다 . pause
아직 명령어를 지원하지 않는 어셈블러에 사용될 수 있습니다 . 이전 프로세서에서 이것은 단순히 nop
2 바이트 에서처럼 아무것도하지 않았습니다 . 하이퍼 스레딩을 지원하는 새 프로세서에서는 성능 향상을 위해 스핀 루프를 실행하고 있다는 것을 프로세서에 대한 힌트로 사용합니다. 에서 인텔의 명령 참조 :
스핀 대기 루프의 성능을 향상시킵니다. “스핀 대기 루프”를 실행할 때 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는 pause
Intel의 ISA ref 수동 입력에pause
의해 보장 된대로 해를 끼치 지 않고 NOP로 디코딩합니다 . 새로운 CPU에서는 절전 / HT 친화 성의 이점을 얻고 회전중인 메모리가 변경되고 회전 루프를 벗어날 때 메모리 정렬 오류를 피할 수 있습니다.
x86 태그 위키 정보 페이지 에있는 Intel의 설명서 및 기타 유용한 정보에 대한 링크
의미없는 rep
접두사가 새 CPU에서 새 명령어가되는 또 다른 경우 lzcnt
는 F3 0F BD /r
입니다. 그 명령 (자신의 CPUID의 LZCNT 기능 플래그 누락)를 지원하지 않는 CPU를, 그것은으로 디코딩 rep bsr
과 동일하게 실행되는, bsr
. 따라서 오래된 CPU에서는을 생성 32 - expected_result
하고 입력이 0 일 때 정의되지 않습니다.
그러나 tzcnt
및 bsf
컴파일러 수 있도록, 비 – 제로 입력과 같은 일을하고 사용 할 수 tzcnt
가 대상 CPU가로 실행되도록 보장되지에도 tzcnt
. AMD CPU는 빠르고 tzcnt
느리며 bsf
Intel에서는 둘 다 빠릅니다. 정확성이 중요하지 않은 한 (플래그 설정에 의존하지 않거나 입력 = 0의 경우 대상 동작을 수정하지 않은 상태로 두지 않는 경우)이를 tzcnt
지원하는 CPU에서 디코딩 하는 것이 도움이됩니다.
rep
다른 방식으로 디코딩하지 않는 무의미한 접두사 의 한 가지 경우 : rep ret
“일반”CPU를 대상으로 할 때 gcc에서 기본적으로 사용됩니다 (예 : -march
또는 로 특정 CPU를 대상으로 지정 -mtune
하지 않고 AMD K8 또는 K10을 대상으로 지정하지 않음). 대부분의 Linux 배포판에서 대부분의 바이너리에 존재하기 때문에 rep ret
다른 것으로 디코딩하는 CPU를 만들 수 ret
있습니다. `rep ret`은 무엇을 의미합니까?를 참조하십시오 .