ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • mov와 lea의 차이
    Legacy/Reversing 2014. 8. 10. 20:16
    728x90

    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이 들어가게 된다.

    'Legacy > Reversing' 카테고리의 다른 글

    달고나 PDF  (0) 2014.08.02
Designed by Tistory.