
ref : 윈도우 실행 파일 구조

ref : 054. 프로세스 메모리 구조
둘의 가장 큰 차이는 초기화 후 초기값을 같는 변수를 저장하는 공간이냐 아니면 초기화하지 않고 저장하는 공간이냐이다.
현대에 와서는 용량이 충분하여 괜찮지만 과거에는 컴퓨터 메모리가 너무 비싸서 최대한 용량을 줄이기 위해 노력했었다. 그로인해 꼭 초기 값이 필요한 경우와 그렇지 않은 경우를 나눠서 사용했다. 그게 data와 bss이다.

먼저 위와같이 코드를 작성하였고 이후 debug를 해서 show memory를 보면 (원하는 변수를 직접 추가하고, type을 일치시켜줘야한다. hex, byte) 아래와 같이 나오는 것을 확인할 수 있다.

a의 경우 array size를 적어주지 않으면 내가 입력한 초기값인 0x11이 잘 나오는 것을 볼수 있다. 하지만 array siz를 12로 적어주면 아래와 같이 바뀐 것을 볼 수 있다.

a를 좀 더 자세히 살펴보면 내가 위에서 입력했던 초기값이 순서대로 들어간 것을 볼 수 있다. a(0x11), b(0x2222), c(0x33333333), d(0x4444444444444444) 이유는 좀더 공부해봐야 알 수 있을거 같다.

우리는 앞에서 배웠던 mov를 통해 a의 값을 rax에 넣어보았다.
하지만 debug 창에서 봤을땐 rax에 0x403010 이라는 값이 들어있고 a의 값이었던 0x11이 보이지 않는다. 0x403010의 의미를 찾기 위해 memory창에 넣은 후 Address 를 체크하였더니 a와 동일한 값이 들어있는 것을 확인했다. 이는 a가 들어있는 값의 주소를 복사해넣었다는 것을 알 수 있다.

주소는 해당 값이 메모리에서 어디에 있는지를 알려주는 부분이고 주소를 복사해온다면 값 전체를 복사할 필요 없이 해당 값을 그대로 사용할 수 있게 된다. 이는 용량을 줄이는 것과도 연결되는 부분이다.
그리고 하나 더 주소의 특징을 확인해보자
아래 그림에서 볼수 있는 것과 같이 a 값이 저장된 주소에 +1 byte를 해주면 b의 값이 나열되는 것을 볼 수 있다. 이를 통해 처음 데이터가 저장된 위치에서 다음 변수들이 그 다음 주소에 하나씩 차곡차곡 저장되어있는 것을 알수 있따.

그러면 값을 직접 복사하는 방법을 알아보자

방법은 위 그림과 같다. 크기를 설정해주지 않을경우 아래와 같이 8바이트 전부가 복사된 것을 확인할 수 있다. (위 a의 값의 8바이트)

하지만 크기를 정해준다면 아래와 같이 0x11이 복사 된것을 알 수 있다.
(앞의 0x12는 그동안 공부하면서 누적된 데이터이므로 무시해도 된다.)

반대로 변수의 값을 복사해넣을 수 있다.


각각에 맞게 값이 바뀐것을 알 수 있다.
오늘은 여기까지
하다보니 PintOS에서 배웠던 어셈블리어들이 기억이 나기 시작했다. 각각의 역할과 어떻게 메모리에 올라갔고 어떻게 동작하였는지가 새삼 느껴지고 있다. 당시에는 내가 아는 것이 맞는 것인가에 대한 확신이 없었는데 조금은 확신을 가져도 될거 같다는 생각을 했다. 앞으로도 어셈블리 강의가 꽤 남았는데 잘 마무리해봐야지