CPP_RO_변수와 레지스터

CJB_ny·2022년 6월 28일
0

C++ 정리

목록 보기
4/95
post-thumbnail

메모리 <-> 레지스터

메모리에 값을 올리는 방법? (+복습)

exe파일 구조를 보면은

Sextion 에 data라는 영역이 있다는 것을 확인이 가능하다.

이 영역이 파일에 저장이 되어있는데 이게 나중에 실행파일을 실행 해가지고

해당프로그램이 실행이 되면은 파일 내용이 메모리에 다 올라간다.

추가로 이녀석만 올라가는게 아니라

메모리 구조를 보면은 Data 뿐만 아니라 Heap, Stack다 올라간다.

메모리에 올리고싶다면

지난번에 사용한 방법은 Data영역을 사용한 방법이였다.

쉽게 사용할 수 있는 방법은 BSS, Data두가지 방법이라고 보면 된다.

가장 쉬운 방법은 이 section .data를 사용하는 방법이다.

바구니 사용

  • 변수의 선언 및 사용

  • 변수는 그냥 데이터를 저장하는 바구니

    CPU옆에 레지스터는 고정된 바구니라고 한다면
    변수의 경우에는 "바구니를 사용할테니까 내 크기에 맞는 메모리를 잡아줘 라는거임

  • 처음에 바구니를 사용하겠다고 선언 (이름, 크기)

이렇게

section .data, section .bss에도 사용할 수 있는데

문법의 차이가 약간 있다.

section .data문법 ❗

초기화된 데이터

[ 변수 이름 ][ 크기 ] [ 초기값 ]

여기서 "크기"는 1 2 3 4 이런 숫자가 아니라

define byte의 약자인 db를 사용한다.

  • 크기

    db(1), dw(2), dd(4), dq(8)


word
https://velog.io/@starkshn/CPPRO%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0-%EA%B8%B0%EC%B4%88


section .bss 문법 ❗

초기화 되지 않은 데이터

변수이름 크기 개수

  • 크기

    resb (1), resw (2), resd(4), resq(8) 바이트

실습

이렇게 해주고 빌드하면 F9 -> 성공적.

data, bss의 차이점은 초기화 되었냐 안되었냐의 차이임.

초기화 이유

실행파일 보면 data section이 이렇게 들어가있다.

우리가

이렇게 넣어준 값이 어딘가에는 알고 있어야하니까 파일(File?)에도 저장이 되어있다고 보면됨.

초기화 되지 않았다 == 초기값이 0으로 셋팅

bss영역은 다 0으로 되어있다.

bss section의

e resb 10의 값은 어차피 0이니까 최종적인 크기만 알고 있으면

-> 파일에다가 굳이 초기값을 셋팅하지 않아도 됨.

=> 실행파일의 크기가 줄어듦. (근데 0으로 놔둘꺼면 왜씀...??)

그래서

데이터 영역이 data, bss로 쪼개진다는거 숙지.

메모리 영역 살펴보기

바구니가 레지스터가 이어져있어서 보여주는것을 12로 잡으면

0x11, 0x22 ... 이렇게 다음 값이 들어가있는게 확인이 가능하다.

주소가 이어져있다.


참고 16진수 두개 => 1바이트의 크기 👍

그래서 실습할때 데이터 영역에 d dq 0x4444444444444444 이렇게함.
44 -> 1바이트 4444 -> 2바이트
0x 4444 (2) 4444 (2) 4444 (2) 4444 (2) => 8바이트 => 64비트


mov => 메모리값 -> 레지스터

mov 키워드를 사용해서 메모리의 값을 이동시켜보자.

지금

이거 실행하기전에 rax에 HEX값을 보면

이런데, 실행하고나면

이런 이상한 값이 들어감. 나는 분명히 a db 0x11 했는데

이거 뭐노? 해서 보니까

rax 의 HEX값 복사후 메모리 살펴보는데 복붙하면

이렇게 0x11의 값이 들어와있네?

강의에서는 다름. ❗

현재 a안의 값을 가져온게 아니라 a안의 주소값을 가져온것이다.

메모리는 다 주소값이 있다. ❗

그 주소가 지금

여기서 처럼 0x403010 이다. 이게 a의 주소임.

그러면 b의 주소값은??

이것은 굳이 mov rax, b같은거 안해도 알 수 있다.

0x403010 에다가 1바이트 더해주면됨.

1바이트 증가 시켰을 때 정확히 b의 주소라는 것을 알 수 있다.

값 복사

a라는 주소의 값을 rax에 복사

그런데 리얼 a의 값을 넣어주고 싶다면

mov rax [ a ]

해주어야한다.

그래서 이렇게 해주면 묘한 값이 들어가있는데

우리가 "크기"를 명시해주지 않아서 rax의 크기인 8바이트 만큼의 값을 넣은것이다.

그래서

이 상태에서 레지스터의 값을 보면

rax에 0x1200 인 상태에서 실행하면은

이렇게 값이 1바이트 만큼 들어가게됨.

메모리 값 살펴보기

19줄 실행하고나면 rax에 0x1211 올라감

그리고 메모리 보면 a에 1바이트 크기에 먼저 0x11들어가있음 여기서 함 더 실행하면

정확히 1바이트 크기만큼 byte 0x55 넣어준걸로 바뀐다.

word해주면 2바이트 만큼 0x66 으로 바뀜.

cl의 값은 0xff인데 이것을 [ a ] 에다가 값을 복사를 해주게되면

1바이트 만큼 0xff 로 변경되었다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글