🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

조사식 관련

22.02.28 16:29 작성 조회수 395

0

64비트 운영체제 환경에서는 모든 기본 단위나 주소 체계 등이 64비트라고 하셨었는데 

조사식에서 esp는 출력이 되지만 rsp의 경우에는

'식별자 "rsp"이(가) 정의되어있지 않습니다' 라고 나오는데 왜 그런 것인지 궁금합니다..   

그리고 조사식에 esp를 입력했을 때 형식은 unsigned int로 동일하게 나오지만 값이 강의와는 다르게 16진수가 아닌 10진수로 출력되는데 바꿀 수 있는 방법이 있을지도 알고 싶습니다(&c 등은 16진수로 출력됩니다) 

답변 1

답변을 작성해보세요.

0

강의에서는 x86으로 실행하고 이 의미는 32비트 프로그램입니다.
x64로 하셔야 64비트 프로그램으로 실행됩니다.

숫자를 바꾸려면 값을 우클릭해서 [16진수 표시]를 누르시면 됩니다.

한울님의 프로필

한울

질문자

2022.02.28

아하 간단한 이유였군요...ㅠㅠㅠ

답변 감사합니다!

한울님의 프로필

한울

질문자

2022.02.28

그리고 1가지 더 궁금한 것이 있습니다

const int 변수(함수 바깥에 있는)가 메모리 할당을 받지 않았는데도 사용 가능한 이유가 디스어셈블리에서 mov dword ptr [c],3을 통해 컴파일러가 모든 값들을 3으로 바꿔치기 해서 그렇다고 하셨는데 

해당 어셈블리어는 c에 3을 저장한다로 의미가 되는 것으로 이해가 되는데 왜 const int 변수가 바꿔치기가 되는지, 그리고 만약 된다면 다른 변수들을 0,1,2로 바꿔치기 해주는 어셈블리어는 없는 것인지 궁금합니다...

어떻게 구현이 되어야한다는 제약사항이
있는건 아니라 그건 컴파일러 마음입니다.
3만 되는 그런건 아니고 가능하면 최적화 된 코드로 만들어주려는 것이죠.

한울님의 프로필

한울

질문자

2022.02.28

컴파일러가 마음대로 한다고는 해도 어쨋거나 const 변수들을 어떻게 마음대로 처리할 것인지는 어셈블리어로 표현이 나올 줄 알았는데 이것 외 해당될만한 다른 어셈블리어를 못 찾겠습니다...ㅠㅠㅠ

질문이 잘 이해가 안가는데요.
컴파일러 최적화가 나온건 별도의 변수 (const 변수)를 메모리에 만들고
그걸 이동시켜서 dword ptr[c]에 넣는게 아니라,
바로 mov dword ptr [c], 3을 넣을 수 있는 부분을 최적화라  한겁니다.
즉 어셈 단계로 까보면 사실 const 변수는 존재도 안하는 셈이죠.

그리고 이 정도로 처음부터 정밀하게 깊게 들어갈 필요는 없고
디테일 한 부분이 궁금하시다면 어느 정도 컴퓨터 구조와 운영체제에 대한
이해도가 생긴 후에 연구하심을 권장 드립니다.

const는 C, C++에나 있는 개념이지 어셈에선 [값이 바뀌지 않는 변수]가 존재하지 않습니다.
그러니 어셈 문법에 맞게 알아서 교체를 하는거고
그게 상수가 될 수도, readonly data가 될 수도 있습니다.
그 이상은 신경쓸 필요 없고 어떤 영역에 저장되었는지를 구분할 이유가 없습니다.

한울님의 프로필

한울

질문자

2022.03.02

고민할수록 머릿속이 점점 꼬이는 느낌이었는데 이제 이해가 확실히 된 것 같습니다 정말 감사합니다!

한울님의 프로필

한울

질문자

2022.03.15

안녕하세요

다름이 아니라, 열거형 강의를 들으면서 const에 대해 궁금한 것이 1가지 더 생겼습니다...;;

auto a = &SCISSORS;와 같은 것 없이

int b = 1;

int c = 2; 을 main 함수 내에 작성하니

mov dword ptr[b],1

mov dword ptr[c],2가 나왔고 여기까지는 이해를 했습니다

 

그런데

auto a = &SCISSORS;를 해서 SCISSORS가 메모리영역에 저장되게 한 뒤에

int b = 1;이라고 main 함수 내에 작성하면

mov dword ptr[b],1 대신

add byte ptr [eax], al

add bh, al 이라고 나오는데 

이 어셈블리어가 변수를 메모리에 만들고 이동시켜서 dword ptr [b]에 넣는 것인가요?

그리고 따로 &ROCK 관련 코드를 작성하지 않았던 c도

inc         ebp  

fadd        qword ptr [edx]  

add         byte ptr [eax],al  

add         bh,al

로 나오는데  

int c = 2;의 어셈블리어가 왜 mov dword ptr[c],2로 나오지 않는 건지 궁금합니다

 

감사합니다!

컴파일러는 C++ 코드를 어셈으로 변환하는 것이 목적이고
C++ 문법과 어셈 문법은 다르기에
컴파일러가 나름의 최선의 방법을 선택하게 짜여져 있을 뿐,
100% 동일하게 꼭 이렇게 해야 한다는 규칙은 없습니다.
const 변수가 단순하게 쓰여지면 그냥 1,2,3 숫자로 하드코딩하는게 낫다고 판단할 수도 있고
특이하게 &를 이용해 const 변수 주소를 사용한다면,
어찌됐건 해당 변수를 만들어야 주소를 추출할 수 있으니  변수로 만들 수도 있겠죠.

한울님의 프로필

한울

질문자

2022.03.15

그럼 이 경우는 컴파일러가

'const SCISSOR의 주소가 필요하네? 얘는 상수로 바꿔치기 하면 안되겠다 + 다른 const ROCK, PAPER들은 주소가 필요없지만 얘네도 변수로 만드는 게 최선인 거 같으니 상수로 바꿔치지 말자' 이렇게 판단한 거라고 이해하면 맞을까요?

그리고 int b = 1;과 int c = 2; 부분에 있는 어셈블리어의 의미가 어떻게 되는지 간략하게나마 설명해주실 수 있을까요?

채널톡 아이콘