CPU가 명령어를 실행할 때, 데이터는 단순한 숫자값이 아니라 메모리 어딘가에 저장된 값이다.
따라서 CPU는
"어떤 메모리 주소에서 데이터를 읽을지"
"어떤 주소에 값을 저장할지"
이걸 알아야한다.
이 주소를 어떻게 계산하고 지정할지를 정한 규칙이 바로 메모리 주소 지정 방식이다.
mov, lea, add, sub
mov는 데이터 복사 명령어이다.
mov eax, [ebx]
ebx의 주소가 가리키는 값을 eax에 복사한다.
lea는 주소 계산 후 로드하는 명령어이다.
lea eax, [ebx+4*ecx]
ebx+4*ecx의 주소값을 계산한 후 eax에 저장한다.
add, sub은 덧셈, 뺄셈 연산을 하는 명령어이다.
add eax, 4
sub eax, 4
eax에 4를 더하고 4를 뺀다.
CPU는 명령어를 실행할 때, 주소를 어떻게 계산해서 접근할 것인가에 따라서 주소 지정 방식이 달라진다.
명령어 안에 값 자체가 직접 포함되어 있다.
CPU가 메모리를 읽을 필요 없이, 명령어에 적힌 값을 그대로 사용한다.
mov eax, 10
eax에 10을 그대로 저장한다.(메모리 접근이 없어 가장 빠른 방식이다.)
명령어가 메모리의 고정된 주소를 직접 지정한다.
mov eax, [val]
section .data
val dd 1234
메모리 변수 val이 저장된 주소에 접근하여,
그 안의 값을 eax로 가져온다.
레지스터가 주소를 저장하고, 그 주소가 가리키는 메모리의 값을 읽는다.
mov eax, [ebx]
ebx가 가리키는 주소의 값이 eax에 복사된다.
기준 주소(base)에 인덱스 값(첨자)을 더해 접근한다.
mov eax, [ebx + esi]
ebx는 배열의 시작 주소, esi는 인덱스 역할을 한다.
eax = arr[i];
위의 C코드와 같은 의미이다.
기준 주소(base)에 상수(변위, displacement)를 더해서 접근한다.
mov eax, [ebx + 4]
ebx 기준으로 4바이트 떨어진 곳의 데이터를 읽는다.
기준 주소(base)에 인덱스(index) * 자료형 크기(scale)을 더해 접근한다.
mov eax, [ebx + esi*4]
ebx는 배열의 시작 주소, esi는 인덱스(배열 첨자), 4는 각 원소의 크기이다.
기준 주소, 인덱스, 변위를 모두 조합한 가장 일반적인 형태이다.
mov eax, [ebx + esi*4 + 8]
ebx + (esi*4) + 8 위치의 메모리에서 값을 가져온다.