대괄호 [ ] 안에 들어가있는 모든 값들은 주소를 나타낸다.

    예)

    [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
    Posted by Config