포인터 연산

namu·2022년 7월 5일

1) 주소 연산자 (&)

  • 해당 변수의 주소를 알려주세요~
  • 더 정확히 말하면 해당 변수 타입(TYPE)에 따라서 TYPE 반환
    int
    pointer = &number;

2) 산술 연산자 (+ -)
pointer += 1;

int*

    • : 포인터 타입이네! (8바이트) 주소를 담는 바구니
  • int : 가리키는 주소의 비트패턴을 int로 해석하라.

[!] 포인터에서 +나 - 등 산술 연산으로 1을 더하거나 빼면,
한번에 TYPE의 크기만큼을 이동하라!

int* pointer = &number;
lea eax,[number]
mov dword ptr [pointer],eax

number += 1;
mov eax,dword ptr [number]
add eax,1
mov dword ptr [number],eax

pointer += 2;
mov eax,dword ptr [pointer]
add eax,8
mov dword ptr [pointer],eax

3) 간접 참조 연산자 (*)
역참조 연산자

4) 간접 멤버 참조 연산자 (->)

  • 간접 참조 연산자
    . 구조체의 특정 멤버를 다룰 때 사용 (어셈블리 언어를 보면 .은 사실상 그냥 덧셈)
    ->는 *와 .를 한방에!
Player player;
player.hp = 100;
mov dword ptr [player],64h

player.damage = 10;
mov dword ptr [ebp-58h],0Ah

Player* playerPtr = &player;
lea eax,[player]
mov dword ptr [playerPtr],eax

(*playerPtr).hp = 200;
mov eax,dword ptr [playerPtr]
mov dword ptr [eax], 0C8h

(*playerPtr).damage = 200;
mov eax,dword ptr [playerPtr]
mov dword ptr [eax+4],0C8h

playerPtr->hp = 200;
mov eax,dword ptr [playerPtr]
mov dword ptr [eax], 0C8h


playerPtr->damage = 200;
mov eax,dword ptr [playerPtr]
mov dword ptr [eax+4],0C8h
profile
안녕하세요

0개의 댓글