10. 메모리 주소 지정방식
대괄호 [ ] 안에 들어가있는 모든 값들은 주소를 나타낸다.
예)
[402000] -> 402000이라는 주소를 나타냄
[EAX] -> 만약 EAX 안에있는 값이 402004라고 하면
그 402004는 주소를 나타냄
1. OFFSET을 이용한 주소 접근
OFFSET이란, 기준 주소에서 얼마큼 떨어진 주소를 가르킬때 쓰는 말이다.
만약 C언어에서 int C[5]라는 배열이 존재한다고 생각해보자.
기준점은 C[0]번째일것이고, 만약에 C[2]번째를 가르킨다고 할 때
C[0] + int형 두개의 크기, 즉 8byte가 되면 C[2]를 가르키게 될것이다.
1) 기준주소를 레지스터에 넣고 OFFSET을 숫자로
이번에는 char B[5]={0,1,2,3,4}라고 하고
B[0]의 주소가 402000이라고 가정했을 때
그렇다면 B[] 배열은 OFFSET을 이용하여
MOV EBX, 402000
MOV dword ptr[EBX+0],0
MOV dword ptr[EBX+1],1
MOV dword ptr[EBX+2],2
MOV dword ptr[EBX+3],3
MOV dword ptr[EBX+4],4
이렇게 존재하게 될것이다.
2) 기준주소를 숫자로 쓰고 OFFSET을 레지스터에
이번에는 char A[3] = {0,1,2}라고 하고
A[0]의 주소가 402000이라고 가정했을때
MOV ECX, 0
MOV byte ptr[402000+ECX], CL
INC ECX
MOV byte ptr[402000+ECX],CL
INC ECX
MOV byte ptr[402000+ECX],CL
이렇게 배열을 만들 수도 있다.
3) INDEX 방식
만약 char 형 배열이아닌 int형 배열이라면 OFFSET의 증가는 4씩이여야한다.
D[3] = {0,1,2} 가 존재한다하면
MOV ECX, 0
MOV dword ptr[402000+ECX*4], ECX
INTC ECX
MOV byte ptr[402000+ECX*4],ECX
INC ECX
MOV byte ptr[402000+ECX*4],ECX
이렇게 *4처럼 산술연산자, 숫자를 쓰는게 INDEX 방식이다.
[BASE + OFFSET + INDEX * SCALE]
대괄호 안에 사용할 수 있는 레지스터의 개수는 최대 2개
INDEX는 반드시 레지스터이여야한다.
base = 기준 주소
offset = 거리
index = offset과 비슷하지만 scale 의 값에 영향을 받는것
scale = 데이터 타입의 크기(int = 4, short = 2 등등)
'Assembly' 카테고리의 다른 글
12. JNE, JA, JB (0) | 2017.05.19 |
---|---|
11. 조건 분기문 (0) | 2017.05.18 |
9. 주소값 간접 지정 (0) | 2017.05.18 |
8. ADD, SUB (0) | 2017.05.18 |
7. INC, DEC (0) | 2017.05.17 |