-
mov와 lea의 차이Legacy/Reversing 2014. 8. 10. 20:16728x90
mov는 좌변에 우변(혹은 상수)의 값을 입력하는 것이다.
lea는 좌변(레지스터만 가능)에 우변의 주소값을 입력하는 것이다.
mov eax, dword ptr ss:[ebp-4];
위의 경우 eax는 ebp-4 메모리 주소에 있는 4바이트(dword)값이 입력될 것이다.
참고로 dword ptr ss:[ebp-4];에서 [주소]는 주소에 존재하는 값을 의미한다.
dword ptr에 의해 4바이트 의 값을 읽어들인다.
word ptr이면 2바이트, byte ptr이면 1바이트를 읽어들인다.
mov는 값을 입력하는 것이므로 mov eax, 12345(상수) 문장은 당연히 성립가능하다.
mov dword ptr ss:[esp-4], 12345;
mov dword ptr ds:[0x00560033], 12345;
이런 식으로 좌변에는 레지스터 뿐 아니라 다른 지역변수나 전역변수도 모두 올 수 있다.
lea eax, dword ptr ss:[ebp-4]
이런 식으로 lea의 좌변은 레지스터만 올 수 있다.
이경우 EAX에는 EBP-4가 들어갈 것이다.
mov를 사용해서도 lea와 같은 효과를 낼 수 있다.
굳이 고치면
mov eax, ebp
sub eax, 4
하면 된다. 주소값 입력하는 데 2줄이나 필요하다.
lea명령의 탄생배경이 이같은 주소값 관계된 두줄 연산의 번거로움을 없애고자 하는 데 있는듯~~~
(저런 문장은 자주 쓰는 명령이므로 lea 같은 다이렉트 명령어를 만들면 좀 더 빨라질 것이다.)
참고로 mov eax, ebp-4 하면 바로 될 것 같은데 이같은 표현식은 문법적으로 불가능한 문장이다.
[esp-8] 처럼 주소값을 의미하는 내에서 []안에서만 저런 표현은 가능하다.
그리고 lea의 우변은 주소값을 가져야되므로 절대 상수는 올 수 없다.
lea eax, 12345는 성립이 불가능하다.
lea eax, dword ptr ds:[0x00567800] (전역변수) 이런 문장은 물론 가능하다.
이 경우 메모리 주소인 0x00567800이 eax에 입력된다.
--------------------------------------------------------------------------------------------
ebp가 0x125e4504 값이고 0x125e4500 메모리 주소로부터 4바이트 공간에 77이란 값이 들어있다면
lea eax, dword ptr ss:[ebp-4];
lea 명령어에 의해서는 eax에는 0x125e4500이 들어가게 되고
mov eax, dword ptr ss:[ebp-4];
mov 명령어에 의해서는 eax에는 77이 들어가게 된다.