Programming Tools/Assembly_어셈블리

어셈블리어 정리노트 3 - 주소 참조 연산자 [], 오프셋, 인덱스 (dereference, offset, index)

LiDARian 2021. 5. 26. 18:05
반응형

주소 참조 연산자 []

주소 참조 연산자 []는 레지스터에 주소값을 넣고, 그 레지스터에 []를 써서 해당 메모리에 접근하게 한다.
C언어에서 dereference 연산자 *라고 생각하면 된다.

mov eax, 00402000 // mov eax, offset 00402000으로 변환된다.
mov dword ptr [eax], 10 // mov dword ptr ds:[eax], 10

// output
// 00402000 메모리에 10이 들어간다.

mov dword ptr ds:[eax], 10에서 ds는 data segment라는 의미이다. 데이터 세그먼트에 관한 어셈블리어 지시어
다른 참고할 만한 자료

이중 괄호([[]])는 안된다. 그래서 메모리에 다른 메모리의 주소를 담아 접근하려면 이렇게 범용레지스터를 거쳐서 이동해야한다.

mov dword ptr [402000], 00402004
mov eax, dword ptr[402000]
mov dword ptr [eax], 12345678

C언어로 짜인 코드

int a = 0;
int * p = &a;
*p = 4;

을 구현한다.

mov dword ptr [402000], 0
mov dword ptr[402004], 402000
mov ebx, dword ptr[402004]
mov dword ptr[ebx], 4

mov eax, [ebx]하면 eax는 4를 담는다.

메모리 주소지정

  • 주소를 가르키는 숫자의 크기는 4바이트, 그리고 각 주소는 1바이트의 공간을 배정받는다.
  • 오프셋:
    {0,0,0,1} 에서,
    가장 왼쪽 원소 기준으로 1은 에서 오프셋 3만큼 떨어져있다.
char a[6] = {0,1,2,3,4,5,6};

C언어로 표현된 이 문장을 ASM으로 표현하면...

mov [ebx], 402000
mov byte ptr [ebx + 0], 0
mov byte ptr [ebx + 1], 1
mov byte ptr [ebx + 2], 2
mov byte ptr [ebx + 3], 3
mov byte ptr [ebx + 4], 4
mov byte ptr [ebx + 5], 5
mov byte ptr [ebx + 6], 6

이런 식으로 표현할 수 있다.


mov byte ptr [402000 + eax], 0 도 가능하다.

char arr[3] = {0,1,2};

는 아래와 같이 표현된다.

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

오프셋 말고, 인덱스는...?

char는 주소 하나가 1바이트라서 그냥 inc하면되는데 int는 그게 안된다...
int형 크기만큼 4씩 증가해야한다.

int a[3] = {0,1,2};는 아래와 같이 표현된다.

mov ecx, 0
mov dword ptr [402000 + ecx*4], ecx
inc ecx
mov dword ptr [402000 + ecx*4], ecx
inc ecx
mov dword ptr [402000 + ecx*4], ecx

그 외

[ebx*4 + 402000 + eax]는 됨

[ebx*4 + ecx + eax] 는 안됨

[ebx + ecx]가능

[]에 관한 문법에서 [base + offset + index*scale] 레지스터의 개수는 최대 2개까지만 적을 수 있다. 그리고 index는 반드시 reg이어야한다.

참고

https://www.tutorialspoint.com/assembly_programming/assembly_quick_guide.htm

https://mirror.math.princeton.edu/pub/oldlinux/Linux.old/Ref-docs/asm-ref.pdf
165쪽 확인

반응형