인프런 강의 "[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문"
강의를 정리한 글입니다.
프로그램 메모리
- 프로그램 실행 시 다음과 같은 데이터가 메모리에 올라간다.
변수의 선언 및 사용
- 변수란 데이터를 저장하는 바구니 같은 것
- 레지스터는 cpu옆의 고정되어있는 바구니들
- 변수는 사용을 요청해서 그때마다 지정한 크기의 새로운 바구니를 할당받는다
(따라서 실행할 때마다 주소 값(바구니 위치?)은 달라진다.) - 변수의 사용을 위해선 변수의 이름 크기 지정이 필요하다.
메모리
- 메모리는 서로 구분할 수 있는 주소(번지수) 값이 있다.
- 실제 빌드되면 변수 명이 아니라 주소 값으로 컴퓨터가 데이터를 확인한다.
.data
- 초기화된 데이터 영역 - 초기 값이 있는 데이터들
- 사용법 : [변수 이름] [크기] [초기 값]
ex) a db 0x11 - 데이터 크기 종류 db(1 byte), dw(2 byte), dd(4 byte), dq(8 byte)
.bss
- 초기화되지 않는 데이터 영역 - 초기 값이 없는 데이터들
- 사용법 : [변수 이름] [크기] [개수]
- 데이터 크기 종류 resb(1 byte), resw(2 byte), resd(4 byte), resq(8 byte)
.data와 .bss 영역을 나누는 이유
File의 크기를 줄이기 위해
실행 파일을 만들 때 초기 값이 있는 .data영역 데이터들의 초기 값들을 다 저장해야 하지만
.bss 영역 데이터들은 초기 값이 없기 때문에 최종 크기만 알면 돼서 File 만들 때 저장할 필요가 없다.
하지만 실제 메모리에 올라갈땐 .bss 영역도 같이 올라간다.
Debug에서 Memory 보는 법
- Variable or expression
- 변수 이름 or 주소 값 정보
- Value
- 데이터 값 Type설정의 따라서 다르게 보임
- Type
- Hex : 16 진수 값으로 Value보기
- b : 1 byte 크기로 봄
- Array Size : 현재 설정한 크기로 몇 개의 데이터 볼 건지
ex) Hex, 1 byte , size 12면 총 12byte 크기의 데이를 16진수로 1byte씩 나눠서 본다. - Address : 해당 값을 주소로 취급해서 해당 주소에 있는 값을 보도록 체크
메모리 <-> 레지스터 사용법
- mov 키워드를 사용한다.
; 메모리 <-> 레지스터
mov rax, a ; 변수 a의 주소값이 rax에 들어간다
mov rax [a] ; [Warning] 변수 a의 값인 0x11이 들어가지만 rax 8 byte로 크기로 되어있기때문에 a의 범위를 벗어난 뒤에 연이은 데이터값도 전부 들어간다.
mov al [a] ; 정상적인 값 대입 정확히 a의 크기밧 1 byte 만큼 a의 값이 들어간다.
;mov [a] 0x55 ; [Error] 상수 넣을땐 크기지정해서 넣어줘야한다.
mov [a], byte 0x55 ; 정상적인 값 대입 a의 1 byte 크기의 값 0x55가 정상대입되었다.
mov [a], word 0x6666 ; [Warning] a의 크기인 1 byte를 넘어서 그 뒤 데이터까지 들어가짐
mov [a], cl ; cl 레지스터 자체가 1 byte 크기 지정이 되어있기때문에 크기지정 필요x
section .data
a db 0x11
데이터 주소 값의 관계
- 데이터 주소값의 연속성
- 주소 값의 연산을 통해 원하는 데이터를 얻어올 수 있다.
ex)
현재 rax의 a의 주소 값(0x403010)이 있는데 Debug를 통해 해당 주소 값을 통해서도 a의 값을 얻어올 수 있다.
여기서 한 가지 사실은 해당 주소 값의 1(byte)를 더하면 그뒤에 할당되어 있는 b의 주소 값이 나온다.
따라서 주소값의 연산을 통해 원하는 변수의 데이터를 가져올 수 있다.
'C++ > 강의 정리' 카테고리의 다른 글
[C++ 섹션 2.데이터 갖고 놀기] 1 - 정수 (0) | 2022.01.16 |
---|---|
[C++ 섹션 1.어셈블리 언어 입문] 3- 레지스터 기초 (0) | 2022.01.04 |
[C++ 섹션 1.어셈블리 언어 입문] 2 - 데이터 기초 (0) | 2022.01.03 |
[C++ 섹션 1.어셈블리 언어 입문] 1 - 환경 설정 (0) | 2022.01.02 |