"[ assembly 명령어 ] mov, lea"
mov ( move )
- 데이터를 복사하는 명령어 (*이동이 아님 주의)
[예시]
1. mov eax, dword ptr [ a ] : a의 주소가 가리키는 4바이트(Dword) 값이 eax에 저장한다.
2. mov eax, [adr] : adr주소가 가리키는 값을 eax에 저장한다.
3. mov dword ptr [ a ], 3 : a에 3 값을 저장한다.
4. mov eax, [ rbx + 8 ] : rbx주소값에 + 8을 한 주소로 가서 그 안에 있는 값을 eax에 복사한다.
5. mov [rcx], rax : rcx레지스터가 참조하는 주소의 메모리에 rax 레지스터의 값을 저장한다.
Lea ( Load Effective Address )
- 유효 주소를 로드하며, 목적지는 레지스터다.
- 데이터 메모리의 주소를 레지스터에 저장하는 명령어.
Effective Address : 어떤 메모리 공간의 주소
lea명령어의 좌변은 레지스터만 올 수 있다. 그러므로 우변에는 상수가 올수 없다. (상수는 주소값을 가지고 있지 않다.) 또한, 레지스터가 가리키는 곳의 값을 더하거 나 빼는 것이 아니라 그 레지스터 값 자체에다 더하거나 뺀다.
[예시]
1. lea rbp, [rsp+8] : rsp레지스터가 저장한 주소에 8만큼 더한 '주소'을 rbp에 저장한다.
struct Point
{
int xcoord;
int ycoord;
};
// 2번 ======================================
int y = points[i].ycoord;
// 3번 ======================================
int *p = &points[i].ycoord;
2. point[ ]는 point의 배열이다. 배열의 기본이 이미 EBX에 있고 변수 i가 EAX에 있고 xcoord와 ycoord가 각각 32bit ( 4byte ) 라고 가정하면 이 명령문은 다음과 같이 컴파일 될 수 있다.
MOV EDX, [EBX + 8*EAX + 4]
// 8은 point가 8byte 사이즈 이기 때문이다.
3. ycoord의 값이 아닌 주소를 얻기를 원하는 3번은 다음과 같이 컴파일이 될수 있다.
LEA ESI, [EBX + 8*EAX + 4]
lea는 주소값을 저장하고, mov는 주소가 가리키는 값을 저장한다.
※ 메모리 접근 " [ ] "
- 명령어의 피연산자(operand)로 사용하는 " [ ] " 괄호 표시는 주소를 나타낸다.
- 컴퓨터 명령어 구조(Instruction) : 컴퓨터에 대한 일련의 마이크로 연산을 기술한 2진코드
연산(OP Code) | 주소 결정 방식(Mode) | 주소 필드(Operand ) |
- Intel 방식의 어셈블리는, 명령코드 연산 결과를 좌변의 피연산자에 저장한다.
※ qword 8byte, dword 4 byte , word 2 byte
※ offset은 base로 부터 얼마나 떨어져있냐는 표시하는 키워드이다. [ base + offset ]
※ ss : 스택 영역
출저
lev 예시 2번, 3번 - https://stackoverflow.com/questions/1658294/whats-the-purpose-of-the-lea-instruction
'👨🏻💻 programming > ◽ 컴퓨터 공학' 카테고리의 다른 글
[세팅] pch : pre compile header 세팅, 다른 프로젝트 참조하기, 실행파일 저장위치 변경하기 (0) | 2025.03.06 |
---|---|
Windows 응용 프로그램 (0) | 2025.02.05 |
안 하는 것 보다 낫겠지
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!