inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[Loạt bài phát triển game MMORPG bằng C++ và Unreal] Phần 1: Nhập môn lập trình C++

스택 프레임 질문합니다!

306

siniz10174993

4 câu hỏi đã được viết

2

함수 영역 스택 프레임이 [매개변수][RET][지역변수] 이렇게 세팅 되어 있다고 알려주셨는데요!

다음 함수를 호출 할 때 매개변수 값만 넘겨주는 것이지 매개변수 주소와 주소 반환 값 주소는 여전히 이전 함수에서 스택 프레임 영역에 있고 다음 함수는 다시 스택 프레임 영역을 지정하고 지역변수 주소는 온전히 자기 영역에서 관리하는 것이라고 이해하는 것이 맞을까요?

그리고 넘어온 매개변수 값을 사용할 때 해당 함수 지역변수로 봐야 할까요?

그리고 다음 함수에서 스택 프레임 영역을 지정할 때 왜 이전 함수 베이스 포인터 주소를 저장하는지도 궁금합니다.

C++

Câu trả lời 1

1

Rookiss

다음 함수를 호출 할 때 매개변수 값만 넘겨주는 것이지 매개변수 주소와 주소 반환 값 주소는 여전히 이전 함수에서 스택 프레임 영역에 있고 다음 함수는 다시 스택 프레임 영역을 지정하고 지역변수 주소는 온전히 자기 영역에서 관리하는 것이라고 이해하는 것이 맞을까요?

네 기본적으로 그렇지만. 매개변수가 포인터or참조 타입이라면 주소를 넘겨줄 것이고, 그 주소는 이전 스택 프레임의 주소겠죠.

그리고 넘어온 매개변수 값을 사용할 때 해당 함수 지역변수로 봐야 할까요?

뭐 그건 관점의 차이지만 크게 중요하진 않습니다. (약간 이전/현재 함수의 중간에 있는 공간이랄까요?)
어차피 사용하는 쪽은 호출된 함수긴 하겠죠.

그리고 다음 함수에서 스택 프레임 영역을 지정할 때 왜 이전 함수 베이스 포인터 주소를 저장하는지도 궁금합니다.

BP는 배에 비유하면 닻 같은 존재입니다. 지역 변수를 접근할 때는 절대 주소가 아니라 BP를 기준으로 하는 상대 주소로 접근하게 코드가 만들어지는데요 (ex. ebp+16번지에 1이라는 값을 대입해라!) 문제는 특정 함수에서 다른 함수를 호출하면, 새로운 스택 프레임이 만들어지면서 그 기준이 바뀌기 때문에 BP 레지스터가 새로운 기준 위치로 갱신됩니다. 함수 호출이 완료되면, 이전 함수로 돌아가야 하는데 '이전 함수의 기준이 되는 BP 주소'를 기억하고 있어야 복원이 가능합니다. 그래서 함수 호출이 완료될 때는 대부분 pop ebp 같이 bp 레지스터에 어떤 주소를 복원하는 코드가 꼭 들어갑니다.

 

0

siniz10174993

답변 감사합니다! 해당 질문을 받고 궁금한 부분이 또 생겼는데요! 함수 호출이 완료되면 다음 코드를 실행하기 위해 주소 반환 값 주소를 이전 함수 스택 프레임에 저장하여 이전 함수로 돌아가 다음 코드를 실행하는 걸로 알고 있습니다! 그럼에도 '이전 함수의 기준의 되는 BP 주소' 를 꼭 기억해야만 복원이 가능한건가요?

0

Rookiss

물론입니다. 사실스택그림의 ret 은 ebp eip두개를 포항해서 말한겁니다

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

541

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

442

1

strcpy() 구현 관련 질문

0

513

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

452

1

클래스 타입의 포인터 질문합니다

0

546

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

497

1

템플릿 특수화 관련 질문

0

384

1

포인터 관련 질문합니다!

0

263

1

Unable to start assembler. Check your settings.

0

830

2

cpu선택

0

539

1

포인터 질문이 있습니다

0

322

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

584

1

iterator 삭제관련

0

406

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

310

1

15 분 45초 대 질문

0

308

0

오른값 참조 in 게임

0

384

0

동적할당 질문이 있습니다

0

449

1

안녕하세요 메모리에 대해 질문드립니다.

0

304

1

함수객체 의 매개변수

0

358

1

복사생성자

0

434

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

420

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

354

1

스택 오버플로우

2

790

1

반환타입, 매개변수타입

0

296

1