포인터 기초

namu·2022년 7월 5일

지금까지 사용한 방식
number라는 이름의 4바이트 정수 타입의 바구니를 만든다.
number라는 변수 스택 메모리에 할당
number = 1이라 함은 nubmer 바구니에 1이라는 숫자를 넣으라는 의미
따라서 스택 메모리에 있는 특정 주소(number 바구니)에 우리가 원하는 값을 넣은 셈
number는 비유하자면 메모리에 이름을 붙인 것
단점은 원본 수정
int number = 1;

TYPE* 변수이름

주소를 저장하는 바구니다!
참고) 포인터라는 바구니는 4바이트(32비트) or 8바이트(64비트) 고정 크기
int* ptr = &number;

근데 남의 주소를 갖고 뭘하라는 거지?
추가 문법 : [주소를 저장하는 바구니]가 가리키는 주소로 가서 무엇인가를 해라!
변수이름 = 값;
int value1 =
ptr;
*ptr = 2;

int number = 1;
mov dword ptr [number],1

int* ptr = &number;
lea eax,[number] // number의 주소를 eax에 넣어라.
mov dword ptr [ptr],eax // 친절하게 [ptr]처럼 변수명이 나와있지만, 나중에 실행파일을 까보면, [ptr]이 아닌 ebp를 상대적으로 계산한 주소로 나타날 것이다.

int value1 = *ptr;
mov eax,dword ptr [ptr]
mov ecx,dword ptr [eax]
mov dword ptr [value1],ecx

*ptr = 2;
mov eax,dword ptr [ptr]
mov dword ptr [eax],2

return 0;
xor eax,eax

TYPE은 왜 붙여줄까?
포인터에 대한 추가 정보
주소에 가면 뭐가 있는데?
ex) 결혼식 청접장에 있는 주소 = 예식장 주소
ex) 명함에 있는 주소 = 회사 주소

0b101010101111
비트 패턴을 어떤 사이즈로 어떻게 해석할 것인가?

타입의 불일치

__int64* ptr2 = (__int64*)&number;
lea eax,[number]
mov dword ptr [ptr2], eax

__int64 value2 = *ptr2;
mov eax,dword ptr [ptr2]
mov ecx,dword ptr [eax]
mov edx,dword ptr [eax+4]
mov dword ptr [value2],ecx
mov dword ptr [ebp-3Ch],edx

*ptr2 = 0xAABBCCDDEEFF;
mov eax,dword ptr [ptr2]
mov ecx,0AABBh
mov dword ptr [eax], 0CCDDEEFFh
mov dword ptr [eax+4],ecx
profile
안녕하세요

0개의 댓글