[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 |