[Assembly] mov와 lea의 차이점

그림자왕국·2020년 9월 21일
0

CS

목록 보기
7/8
post-thumbnail
post-custom-banner

mov : 값을 가져온다.
lea : [주소값]을 가져온다.

int num = 10;
008F18B2  mov         dword ptr [num], 0Ah  // [num]주소에 0Ah(10)을 저장
int * ptr = #
008F18B9  lea         eax,[num]  // eax에 [num]주소 값을 저장
008F18BC  mov         dword ptr [ptr],eax  // [ptr]에 eax 값을 저장
*ptr = 12;
008F18C5  mov         eax,dword ptr [ptr]  // eax에 [ptr]의 값을 저장 ([num]주소 값이 저장됨)
008F18C8  mov         dword ptr [eax],0Ch  // eax 레지스터 자체에가 아닌, eax 값을 주소로 사용하여
					      메모리([num]주소)에 0Ch(12)을 저장

메모리 주소를 가르킬 때 []를 사용한다.
[eax]는 eax 값으로 주소를 가르킨다는 의미다.
dword ptr은 4Byte 단위로 접근하겠다는 의미다.

정리

※ ebp 레지스터 값이 0x0010이고 0x0014 위치에 값 30이 저장되어 있다면,
mov eax, [ebp+4] 명령을 통해 eax 레지스터엔 값 30이 저장되고
lea eax, [ebp+4] 명령을 통해 eax 레지스터엔 0x0014가 저장된다.


보너스

num = v;
002818DE  mov         eax,dword ptr [v]  
002818E1  mov         dword ptr [num],eax  // dword ptr[num], dword ptr[v] ?

mov의 좌∙우변 동시에 메모리 엑세스가 올 수 없는 이유? (레지스터끼리는 가능)

메모리를 불러오면 반드시 읽은 데이터를 누군가(레지스터)가 점유하고 있어야 하기 때문이다.
읽은 메모리값을 다시 덮어쓰기 전까지 유지할 수단이 필요하며, 메모리 스스로 읽고 나서 다시 특정 위치에 쓰는 걸 할 수 없기에 컴퓨터는 연산 시 상수값 쓰기가 아닌 이상 레지스터가 요구된다.

profile
언리얼 엔진 매니아입니다.
post-custom-banner

1개의 댓글

comment-user-thumbnail
2021년 11월 19일

안녕하세요 .. 글 도중에 c 언어 아래에 어셈블리어를 쓰시던데요 혹시 clang 이나 gcc 에서 혹은 다른컴파일러로 변환했을때 위에 박스 안에 있는 코드처럼 자동으로 변환해주는 방법이 있나요? 아니면 그냥 각 부분마다 스스로 체크해야하는건가요?.. 되게 바보같은 질문이지만 어셈블리어를 통해 c/cpp 배울때 꼭 봐봐야되는 부분이 있어서 여쭤봅니다.

답글 달기