주소 참조 연산자 []
주소 참조 연산자 []
는 레지스터에 주소값을 넣고, 그 레지스터에 []
를 써서 해당 메모리에 접근하게 한다.
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쪽 확인
'Programming Tools > Assembly_어셈블리' 카테고리의 다른 글
어셈블리어 정리노트 4 - 조건 분기 명령어 (0) | 2021.05.26 |
---|---|
어셈블리어 정리노트 3 - JMP, INC, DEC, ADD, SUB (0) | 2021.05.19 |
어셈블리어 정리노트 2 (0) | 2021.05.10 |
어셈블리어 정리노트 1 (0) | 2021.05.09 |