itsource

LEA EAX, [EAX]의 의미는 무엇입니까?

mycopycode 2023. 6. 21. 22:35
반응형

LEA EAX, [EAX]의 의미는 무엇입니까?

LEA EAX, [EAX]

나는 이 명령어를 마이크로소프트 C 컴파일러로 컴파일된 바이너리에서 만났습니다.그것은 분명히 EAX의 값을 바꿀 수 없습니다.그럼 왜 거기에 있는 거지?

그것은NOP.

다음은 일반적으로 다음과 같이 사용됩니다.NOP그들은 모두 같은 일을 하지만 길이가 다른 기계 코드를 생성합니다.정렬 요구 사항에 따라 다음 중 하나가 선택됩니다.

xchg eax, eax         = 90
mov eax, eax          = 89 C0 
lea eax, [eax + 0x00] = 8D 40 00 

기사에서:

이 트릭은 MSVC++ 컴파일러에서 다른 길이의 NOP 명령을 방출하는 데 사용됩니다(점프 대상 전 패딩용).예를 들어 MSVC++는 4바이트 및 6바이트 패딩이 필요한 경우 다음 코드를 생성합니다.

8d642400 lea [ebx+00], ebx; 4바이트 패딩 8d9b 00000000
lea [sla+00000000,slot; 6바이트 패딩

컴파일러에서 생성한 어셈블리 목록에서 첫 번째 줄은 "npad 4"로 표시되고 두 번째 줄은 "npad 6"입니다.레지스터(ebx, esp)는 코드의 잘못된 종속성을 피하기 위해 거의 사용되지 않는 레지스터 중에서 선택할 수 있습니다.

따라서 이것은 일종의 NOP로, jmp 명령어의 대상 바로 앞에 나타나 정렬합니다.

흥미롭게도, 당신은 그러한 명령어의 특성으로부터 컴파일러를 식별할 수 있습니다.

LEA EAX, [EAX]

사실 EAX의 가치는 변하지 않습니다.제가 알기로는 다음과 같은 기능을 가지고 있습니다.

MOV EAX, EAX

최적화된 코드로 보았습니까, 아니면 최적화되지 않은 코드로 보았습니까?

언급URL : https://stackoverflow.com/questions/2703394/whats-the-point-of-lea-eax-eax

반응형