inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

분기문

160

움직이는YM

작성한 질문수 86

0

분기문 강의 28분쯤에

switch문을 어셈블리어로 확인 하는 부분이 있습니다.

switch (input)

00315E8D  mov         eax,dword ptr [input]     ---1번

00315E90  mov         dword ptr [ebp-118h],eax  ---2번

00315E96  cmp         dword ptr [ebp-118h],0  --3번

1번 : 어셈블리어를 확인해보면 input을 eax 레지스터에 복사해 넣고

2번 : eax에 있는 값을(input 값이겠지요) 스택안에 넣는 모습[ebp-118h]을 확인할 수 있습니다.

VS에서 switch 안에 있는  input을 눌러보면 switch 밖에 있는 int input = ROCK; 의 input과 동일하다는 의미로

같이 밑줄(? 그 같이 파란색으로 하이라이트)을 그어주는데

어셈블리어를 보면 switch안의 input이 아예 스택 메모리에 따로 잡히는 것 같습니다.

이건 왜 그런건가요?

switch문 밖의 input과 switch(input) 안의 input은 서로 다른 input 인건가요?

switch(input2)라고 하면 오류가 나던데 그렇다면 같은 input 아닌가요??? 같다면 메모리를 같이 써야 하는것

아닌지 궁금합니다.

C++

답변 2

1

Rookiss

VS에서 switch 안에 있는  input을 눌러보면 switch 밖에 있는 int input = ROCK; 의 input과 동일하다는 의미로
같이 밑줄(? 그 같이 파란색으로 하이라이트)을 그어주는데

-> 위에서 말하는 의미가 무엇인지 잘 이해가 안가네요. 혹시 스샷을 첨부해주시면 감사하겠습니다.

어셈블리어를 보면 switch안의 input이 아예 스택 메모리에 따로 잡히는 것 같습니다.
이건 왜 그런건가요?
switch문 밖의 input과 switch(input) 안의 input은 서로 다른 input 인건가요?

input 변수 자체는 당연히 하나밖에 없고, 어디서나 동일한 애입니다. (스택 메모리에 상주)
다만 switch가 만들어지는 코드를 보면 input변수를 꺼내서
스택의 다른 공간 (위의 ebp-118; 일종의 temp변수)에다
꺼낸 다음, 그 temp 값을 다시 0 1 2와 비교하고 있는데, 사실 큰 의미는 없습니다.
컴파일된 결과를 보면 항상 최적의 결과로만 만들어주는게 아니라는 것을 알 수 있는데,
[input] 위치의 값을 바로 cmp 해도 동일한 결과가 만들어지겠지만
아마 컴파일러를 만드는 입장에서는
저런 식으로 연관된 모든 부분을 치환하는게 쉽지 않을 것으로 예상됩니다.
지금은 우리가 switch를 스택 메모리에 있는 input으로 하고 있지만,
경우에 따라 전역 메모리나 다른 옵션도 가능하겠죠.
그러니 코드 자체는 temp 값을 비교한 형태로 만들고
처음에 그 temp 값만 실제 비교 대상 메모리에 있는 값을
복사하는 형태로 만든 것이라고 볼 수 있습니다.

0

움직이는YM

아 input 자체는 스택에 잡혀 있고

ebp-118h 는 일종의 temp 변수 같은 것인데 일단 스택의 다른 부분을 가리키는 것이다. 

이해 했습니다. 답변감사합니다.

말씀드렸던 파란색은 스샷 첨부하겠습니다.

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

0

541

1

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

0

442

1

strcpy() 구현 관련 질문

0

513

1

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

0

453

1

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

0

546

1

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

0

498

1

템플릿 특수화 관련 질문

0

385

1

포인터 관련 질문합니다!

0

265

1

Unable to start assembler. Check your settings.

0

831

2

cpu선택

0

540

1

포인터 질문이 있습니다

0

324

1

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

0

585

1

iterator 삭제관련

0

406

1

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

0

310

1

15 분 45초 대 질문

0

309

0

스택 프레임 질문합니다!

2

306

1

오른값 참조 in 게임

0

384

0

동적할당 질문이 있습니다

0

450

1

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

0

305

1

함수객체 의 매개변수

0

360

1

복사생성자

0

434

1

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

0

421

1

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

0

355

1

스택 오버플로우

2

790

1