일부 NOP 코드는 다른 NOP 코드와 다르게 취급됩니까?


12

나는 이것에 대해 궁금합니다.

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

정확히 이것과 동일하게 실행됩니까?

00000000001 0F1F00                          nop        dword [ds:rax]

두 번째 예가 첫 번째와 반대되는 영향은 무엇입니까?


1
나는 두 번째 명령이 첫 번째 명령보다 3 번째가 아니라 첫 번째 명령보다 빠르게 실행될 것이라고 생각하는 경향이 있습니다.하지만 현대적인 파이프 라이닝이이를 바꿀 수 있습니다.
Loren Pechtel

1
왜 태그가 c 입니까?
키이스 톰슨

에 대한 Google은 multi byte nop꽤 많은 결과를 보여줍니다.
phant0m

1
@KeithThompson-C 및 코딩 스타일 태그를 가져 왔습니다. 그들은 속하지 않았다.

@ phant0m-그 의견을 답변에 넣고 더 관련성이 높은 결과를 요약 하시겠습니까? 우리 모두가 해당 검색어에서 어떤 일이 발생할지 올바르게 이해해야 할 배경이있는 것은 아닙니다.

답변:


2

기계 아키텍처에 따라 다릅니다. 고전적인 KA-10 (pdp-10)은 많은 nop 코드를 가지고 있었으며, 아마도 매우 규칙적인 명령어 세트의 결과이며 모든 마이크로 코드가 아닌 descrete 구성 요소에 의해 구현되었다는 사실입니다. 일부 NOP는 메모리를 참조했지만 일부는 건너 뛰지 않은 건너 뛰기 테스트 였지만 건너 뛰기를 유발할 수있는 조건 등을 테스트했습니다. "JFCL 0"은 매뉴얼에서 가장 빠른 nop로 광고되었습니다.


여러 NOP를 단일 JMP 명령으로 대체하는 옵션을 제공 한 (8085?) 어셈블러에서 한 번 작업했습니다. 성능 페널티를 지불하지 않고 원하는 정렬을 얻었습니다. PIC에 문자열이있을 때 편리합니다. CPU 기반 타이밍 루프가있는 경우에는 편리하지 않습니다 (기본적으로 해제되어 있음).
TMN

대부분의 경우 NOP 명령어는 일반적으로 일부 하드웨어 종속성 또는 장치 정오표 작업의 결과로 짧은 지연을 삽입하는 데 사용됩니다. 성능 저하는 NOP를 사용하는 이유입니다.
uɐɪ

1
nops는 호의적 인 용도가 많습니다. 일부 아키텍처에는 점프에 대한 바이트 정렬 요구 사항이 있습니다. 자체 수정 코드 (공포!)는 접합점으로 nops를 사용했습니다. 버그 시스템은 nops를 사용하여 실패한 어설 션에 대한 정보를 저장했습니다.
ddyer

@ddyer : 일부 프로세서는 메모리 바이트를 페치하고 페치 된 값을 완전히 무시하거나 프로그래머가 신경 쓰지 않을 set 플래그를 제외하고 아무 것도 수행하지 않는 명령 (경우에 따라 문서화되거나 때로는 그렇지 않음)을 가지고 있습니다. 6502에서 "BIT abs"명령어를 다음 2 바이트를 고 블링하는 수단으로 사용하는 것이 일반적이었습니다. 플래그를 업데이트하지 않는 것을 제외하고 비슷하게 동작하는 문서화되지 않은 opcode도 있습니다. 그러나 이러한 트릭을 사용하는 한 가지주의 사항 : 1 바이트의 주소 공간을 읽습니다. 일부 6502 주변 장치는 읽기 작업에 반응 할 수 있습니다.
supercat

0

두 번째 예제는 첫 번째 예제보다 더 빨리 실행되어야합니다. 첫 번째 예에서는 세 개의 개별 명령이 실행됩니다. 두 번째는 단 하나의 명령입니다. 멀티 바이트 NOP는 CPU "힌트"(정확하게 언제 어떻게 기밀인지 )에 사용하기위한 것 입니다. 이들은 캐쉬 라인에서 긴밀한 루프를 시작하기 위해 정렬 목적으로 유용 할 수 있지만 현재는 다른 용도가 없습니다. CPU가 실제로 인수를 평가하는지 여부는 확실하지 않으므로 명령어 디코딩 시간을 늘리거나 메모리 액세스 패널티가 발생하는지 여부를 말할 수 없습니다. 좋은 ICE를 가진 사람은이 중 하나를 테스트하고 버스 추적에서 어떤 주소가 팝업되는지 확인하고 싶습니까?


많은 6502 어셈블러가 메모리 페치 (예 : NOP $ 1FF9)를 수행하는 문서화되지 않은 opcode에 니모닉 "NOP"를 사용하지만 주소 0x1FF9를 읽고 읽은 값을 무시하는 2 바이트 명령어가 될 수 있지만 칩 제조업체는 특정 주소 (0x1FF9와 같은 경우)를 트리거하는 하드웨어 (예 : 코드 뱅크 1로 전환)에 프로세서가 연결되지 않는다는 보장이 없기 때문에 프로그램 카운터 / 명령 포인터를 넘어서 수행하는 명령어에는 "nop"라는 용어를 사용하십시오. )에 액세스하면 이러한 트리거링이 정확히 "작동하지 않음"이 아닙니다.
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.