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
'itsource' 카테고리의 다른 글
리포지토리 패턴을 올바르게 사용하는 방법 (0) | 2023.06.26 |
---|---|
SQL "IN" 절에서 튜플 사용 (0) | 2023.06.21 |
SELECT max(x)가 null을 반환합니다. 0을 반환하려면 어떻게 해야 합니까? (0) | 2023.06.21 |
Android - Firebase - TaskSnapshot - Method는 개인 범위 내에서만 액세스해야 합니까? (0) | 2023.06.21 |
오류: C 스택 사용량이 제한에 너무 가깝습니다. (0) | 2023.06.21 |