인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

한울님의 프로필 이미지
한울

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

포인터 실습

함수문법과 어셈블리어 관련 궁금증...

작성

·

180

0

안녕하세요

어셈블리어랑 코드를 살피다가 궁금한 점이 들었는데

1. 구조체 player를 만들면서 멤버로서 hp,attack,defence을 int type으로 선언하였는데

    다른 monster.[멤버]들이나 ret.[멤버]들에 값을 넣을 때의 어셈블리어는 [ebp-0Ch],[ebp-8]로 4바이트 간격을 띄고 있었지만 player.[멤버]들에 값을 넣을 때의 어셈블리어는 [ebp-10h], [ebp-0Ch]로 2바이트 간격을 띄고 있었습니다..왜 이런 현상이 발생한 것인가요?

(조사식에서는 &(player.[멤버])를 하니 정상적으로 4바이트 간격이 나왔지만 디스어셈블리에서만 이럽니다...)

2. 

StatInfo CreatePlayer();라는 함수를 선언할 때 이 경우 함수의 시그니처는 output(반환)형식은 statinfo 타입이고 input(매개변수)은 없다!인 것으로 알고 있는데

스택 프레임이

[매개변수][ret][지역변수(temp(c,c,c -> 100, 10, 2), player(b,b,b -> 100, 10, 2))] | [매개변수(&temp)][ret][지역변수(ret(100, 10, 2))]

가 된다면 CreatePlayer()함수의 스택에 매개변수 &temp가 들어온다는 의미인데 문법적으로 가능한 것인가요?

3.

mov [player], 0xbbbbbbbb는 player 변수 메모리(바구니)에 해당 값을 복사한다

mov [esp-10Ch], 0xbbbbbbbb는 esp-10Ch 주소값 안에 들어있는 메모리에 해당 값을 복사한다

lea eax,[ebp-11Ch] 는 &(ebp-11Ch)가 아닌 주소값 ebp - 11Ch를 eax에 복사한다

정도로 이해해도 괜찮을까요?

원래는 lea eax, [변수]면 변수의 주솟값(&변수) 복사, mov eax, [변수]면 변수의 내부값(변수) 복사

이렇게 이해했었는데

최대한 검색을 해봤는데도

메모리창에 &ret랑 ebp-10Ch가 동일한 값을 가지는 것과

[ret]랑 [ebp-10Ch]가 동일한 의미를 가지려면 어떻게 해석해야 하는지랑

lea 어셈블리어 해석에서 자꾸 헷갈려서....

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

1.
0x10 = 16
0x0C = 12
고로 16-12=4

2.
네 C++ 관점과 로우레벨 관점은 달라도 무방합니다.
리턴값을 복사해서 뱉어주는 경우도 있지만,
최적화를 위해 컴파일러들이 최적화해서 바로 복사없이 원본 데이터에 꽂아주는 경우도 있습니다.

3. lea가 원래 좀 헷갈립니다. 저도 리버싱 공부할 때 맨날 문서를 다시 보고 했던 기억이 있네요.

한울님의 프로필 이미지
한울
질문자

1. 헉...몇 번씩이나 다시 읽었는데도 10진수로 계속 해석을 해버렸네요;;

2. 

참조 변수도 포인터처럼 주소값을 들고 있는 상태라고 하셨는데

어셈블리어에서는 reference 바구니 안에 &number가 들어가게 되는 반면,

조사식에서는

reference 바구니 안에  number의 값이 들어가게 되었는데(pointer 바구니는 2개 다 &number가 들어감)

어떻게 결과는 동일하게 나오는 것인가요?

한울님의 프로필 이미지
한울

작성한 질문수

질문하기