[MASM x86]

 

ex)

ebp = 0x12345678 

0x12345678번지의 값 = 0x33445566으로 가정하자. 

 

---------------------------------------------------------------------

1. lea eax, ebp

2. lea eax,  DWORD PTR [ebp]

3. mov eax,  ebp

4. mov eax,  DWORD PTR [ebp]

 

1. 은 오류이다. 

2,3은 같은 의미이다. 모두 다 ebp 레지스터의 값(0x12345678)을 eax에 저장한다. 따라서 eax = 0x12345678가 된다. 

4. ebp의 레지스터의 값의 쓰여진 주소로 접근해서 값을 eax에 쓰라는 의미이다. 따라서 eax = 0x33445566가 된다. 

 

2,3이 같다면, mov대신 왜 lea를 쓸까?

찾아보니, 배열에 접근해야 하는 경우 예를 들어, 

 

lea eax,  DWORD PTR [ebp-12]는 성립하지만,

mov eax,  ebp-4는 오류이다. 

 

굳이 mov를 사용하려면,

sub ebp, 12

mov eax, ebp를 해야한다. 만약 수식이 더 복잡해지면 예) ebp - 2*ecx  - 12 

mov를 사용하는 것은 낭비일 것이다. 

하지만, lea를 쓰면 ALU에서 lea 한 명령어로 주소 연산을 완료할 수 있다고 한다. 

 

참고

 

IBM PC 어셈블러 프로그래밍, 이재광 & 전병찬

'프로그래밍 언어 > Assembly' 카테고리의 다른 글

명령어 push, pop  (0) 2021.03.05
Assembly - 범용 레지스터  (0) 2021.01.17

+ Recent posts