외로운 Nova의 작업실

Assembly 언어 공부 - 28(간접 주소 지정 이론2 - rea 명령어) 본문

Programming/Assembly

Assembly 언어 공부 - 28(간접 주소 지정 이론2 - rea 명령어)

Nova_ 2022. 10. 2. 10:43

안녕하세요, 이번시간에는 간접 참조에대해서 좀 더 정리를 해볼까합니다.

 

LEA 명령어

간접 참조에 대해 설명하기 좋은 명령어가 있습니다. 바로 LEA 명령어 입니다. LEA 명령어에 대해 알기전에 한가지 물음을 던져 보겠습니다. 우리는 간접 참조를 한다고 하면 아래와 같이 사용합니다.

.code

mov eax, [ebx]

만약, ebx에는 0x12345678이라는 값이 들어있고, 0x12345678 번지주소에는 0xAABBCCDD 값이 있다고 치면 eax에는 어떤 값이 들어가게 될까요? 답은 0xAABBCCDD입니다. 

[ebx] -> [0x12345678] -> 0xAABBCCDD 로 변경됩니다. 즉, 0x12345678 번지주소에 있는 값으로 변경되는 것입니다. 그렇다면 만약 아래와 같은 코드는 어떻게 될까요?

.code 

mov eax, [ebx-2]

만약 ebx에는 0x12345678 이라는 값이 들어있고, 0x12345676 번지주소에는 0xEEFFEEFF 값이 들어있다고 치면 eax에는 어떤 값이 들어가게될까요? 답은 0xEEFFEEFF 입니다.

[ebx-2] -> [0x12345678 - 2] -> [0x12345676] -> 0xEEFFEEFF로 변경됩니다. 그렇다면 만약에 eax에 0x12345676의 값을 전달하려면 어떻게해야할까요? 아래 코드처럼 쓸 수 있을까요?

.code

mov eax, ebx-2

위 코드를 컴파일하면 에러가 납니다. 뭐, sub ebx, 2 명령어 후에 eax에 ebx를 mov 하면 되겠지만요. 하지만 이걸 가능하게하는 명령어가 있습니다. 바로 LEA명령어 입니다.

.code

lea eax, [ebx-2]

만약 ebx에는 0x12345678 이라는 값이 들어있고, 0x12345676 번지주소에는 0xAABBCCDD 값이 들어있다고 치면 eax에는 어떤 값이 들어가게될까요? 답은 0x12345676 입니다. 

[ebx-2] -> [0x12345678 - 2] -> [0x12345676] -> 0x12345676 주소값이 eax에 저장됩니다. 이게 Lea 명령어와 mov 명령어가 다른 점입니다. 그림으로 표현하면 아래와 같습니다.

간접 참조가 헷갈릴때는 컴퓨터의 입장에서 생각하면 편합니다. 모든 것을 주소로 변경하는 것이죠. 이것으로 lea 명령어에대한 설명을 마치도록 하겠습니다.

Comments