"nop; jmp 짧음" 대 "jmp 짧음; nop"

"nop; jmp 짧음" 대 "jmp 짧음; nop"

좋아, 먼저 이 점을 분명히 하겠다. 이것은 마이크로 최적화에 관한 것이 아니다.

하지만 파티션의 부트로더에서는 jmp short; nop코딩을 많이 사용한다는 것을 알고 있습니다. 그러나 jmp가 "점프"하는 양이 적을수록 프로세서가 완료하는 데 걸리는 사이클이 줄어들고 일부 프로세서는 0x90이를 보고 평가하지 않고 건너뛴다는 것을 이해합니다 .

답변1

당신은Intel 64 및 IA-32 아키텍처 소프트웨어 개발자 매뉴얼, 프로그래머의 관점에서 x86 아키텍처를 이해하는 데 훌륭한 리소스입니다(이미 어셈블리에 익숙하다고 가정).

[...] jmp가 "점프"하는 양이 적을수록 프로세서가 완료하는 데 걸리는 사이클이 줄어든다는 것을 이해합니다.

근거리 점프와 원거리 점프를 구별해야 합니다. 근접 점프는 단순히 명령 포인터(IP)에 대한 오프셋을 추가(또는 2의 보수 수학을 통해 빼기)하거나 현재 코드 세그먼트(CS)에서 IP 오프셋을 다시 로드합니다. 근거리 점프는 명령 단어 자체 또는 레지스터에 오프셋을 저장할 수 있는 경우가 많으므로 전체 점프 명령을 한 사이클에 가져올 수 있습니다.

원거리 점프는 명령 포인터의 실제 새 주소를다음단어 또는 메모리 위치에 있으므로 추가 가져오기가 필요하므로 시간이 더 오래 걸립니다. x86 및 x86-64에서는 다음을 수행할 수 있습니다.~ 아니다레지스터에 있는 위치로 멀리 점프합니다(다음 명령어이거나 메모리의 위치여야 함).

일부 프로세서는 0x90을 보고 평가하지 않고 건너뜁니다.

NOP예, 이것이 명령어가 수행해야 하는 작업에 대한 정의입니다 . CPU는 여전히 opcode를 가져와야 0x90하지만 평가는 기본적으로 아무 작업도 수행하지 않습니다.

관련 정보