본문 바로가기
C++/강의 정리

[C++ 섹션 1.어셈블리 언어 입문] 4 - 변수와 레지스터

by 몽실이 2022. 1. 5.
인프런 강의 "[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문"
강의를 정리한 글입니다.

 

프로그램 메모리


  • 프로그램 실행 시 다음과 같은 데이터가 메모리에 올라간다.

메모리 구조

 

변수의 선언 및 사용


  • 변수란 데이터를 저장하는 바구니 같은 것
  • 레지스터는 cpu옆의 고정되어있는 바구니들
  • 변수는 사용을 요청해서 그때마다 지정한 크기의 새로운 바구니를 할당받는다
    (따라서 실행할 때마다 주소 값(바구니 위치?)은 달라진다.)
  • 변수의 사용을 위해선 변수의 이름 크기 지정이 필요하다.

 

메모리


  • 메모리는 서로 구분할 수 있는 주소(번지수) 값이 있다.
  • 실제 빌드되면 변수 명이 아니라 주소 값으로 컴퓨터가 데이터를 확인한다.

.data

  • 초기화된 데이터 영역 - 초기 값이 있는 데이터들
  • 사용법 : [변수 이름] [크기] [초기 값] 
    ex) a db 0x11
  • 데이터 크기 종류 db(1 byte), dw(2 byte), dd(4 byte), dq(8 byte)

SASM 에서 .data 선언 예시

 

.bss

  • 초기화되지 않는 데이터 영역 - 초기 값이 없는 데이터들
  • 사용법 : [변수 이름] [크기] [개수]
  • 데이터 크기 종류 resb(1 byte), resw(2 byte), resd(4 byte), resq(8 byte)

SASM 에서 .bss 선언 예시

.data와 .bss 영역을 나누는 이유
File의 크기를 줄이기 위해
실행 파일을 만들 때 초기 값이 있는 .data영역 데이터들의 초기 값들을 다 저장해야 하지만
.bss 영역 데이터들은 초기 값이 없기 때문에 최종 크기만 알면 돼서 File 만들 때 저장할 필요가 없다.
하지만 실제 메모리에 올라갈땐 .bss 영역도 같이 올라간다. 

 

Debug에서 Memory 보는 법

SASM 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)

SASM에서 데이터의 주소표시

현재 rax의 a의 주소 값(0x403010)이 있는데 Debug를 통해 해당 주소 값을 통해서도 a의 값을 얻어올 수 있다.
여기서 한 가지 사실은 해당 주소 값의 1(byte)를 더하면 그뒤에 할당되어 있는 b의 주소 값이 나온다.
따라서 주소값의 연산을 통해 원하는 변수의 데이터를 가져올 수 있다.

 

해당 강의 SASM 코드