어셈블러를 수월하기 위해서는 사실 절차적인 면에서,
Register SetMemory Map에 관한 이해가 가장 필수적이다.

지난번에 Register Set에 대해서는 여러번 언급을 하였고,
이번에는 Memory Map에 대하여 이야기 하려 한다.

확실히 이 두가지가 돌아가는 구조를 확실히 알아야, 배열 및 구조체 및 기타 여러 기능들을 구현이 가능하고 쉽게 프로그래밍이 가능하다. 워낙 눈에 보이지 않는 개념적인 구조라 더욱 확실히 알아야 한다.
필자가 읽은 책에도 이러한 자세한 언급은 뒤쪽에 되어 있어, 이제서야 포스팅을 하고 있다 -.,-;

자, 그럼 예전에도 많이 등장했던 Memory Map 그림을 보자.


좌측의 그림은 아래쪽이 높은 주소이고, 위가 낮은 주소로 낮은 주소로 Stack이 자라나는 방향이다. %sp와 %fp와의 관계는 Stack설명시 여러번 언급했다.

여기서 Heap은 Stack과는 달리 단순히 쌓여서 올라가는 구조가 아닌 공간에 할당되는 영역이다. Heap의 경우 Stack과는 다른 방향, 즉 위에서 아래로(낮은주소에서 높은주소로) 증가하게 된다.

그림상에서 가운데 부분에 큰 두께의 선을 기준으로 위의 text, data, bss영역은 Static 영역이다. 이 부분은 컴파일 시간에 할당되는 영역이다.

그리고 아래 방향의 heap과 stack은 dynamic영역으로 실행시간에 할당되는 영역이다. (heap : 실행 시간 임의의 지점에서 메모리를 할당/수거, stack : 함수호출때마다 프레임 할당영역)

그럼 이제 우리가 모르는 것은 바로 text영역과 data영역, bss영역 이다. 이제 이 3가지가 무엇인지에 대하여 알아보자.

먼저 [text]영역
이 부분은 Read-Only변수가 저장되는 공간이다. 우리가 작성하는 코드부분이 바로 text영역이다. 이 부분은 Section ".text"으로 시작된다. 이곳에 저장되는 공간은 프로그램 실행도중 변경 및 수정이 불가능하다. 프로그램상에서 가장 하단부에 존재한다. (일반적으로)



[data]영역
이 부분은 초기화시키는 영역이다. 이 공간은 추후 일정 메모리 접근 공간으로 사용가능하다, 즉 프로그램 실행도중 자유롭게 접근하여 수정 및 변경이 가능하다. Label을 통한 주소로 접근이 가능하다. 레이블 내에서 컴마로 연속되는 공간은 각 단위별로 연결되어 있다.

[bss]영역
bss영역은 data영역과 마찬가지로 초기화 시키는 영역이다. 단 메모리상 공간만 잡아 놓고 실제로 수를 초기화 시키지 않는다. 조금 깊이 들어가면 bss영역에서는 어느정도의 공간의 크기를 저장할 것이라는 정보를 저장한다. 그후 런타임시에 VM에 링크되어 올라간 후 세그먼트로 바뀔때 영역이 확보된다.
즉 data영역과의 차이점은 바로 이부분이다. 즉 data영역은 초기에 사용할 메모리를 확보하는 반면 bss영역에서는 런타임후에야 메모리영역이 확보된다. 즉 메모리 사용면에서 bss영역을 사용하면 효율적이다. 즉 선언시 초기화 할 필요 없는 변수들을 할당할때 사용된다.

코드상에는 보통 상단에 bss 다음 data 다음 text영역으로 선언한다.
.section이 영역부분을 선언하는 것이다. 이를 코드를 통해 알아보자.

[작성환경 : solaris sparc machine  작성툴 : Vi editor   컴파일러 : gcc]


2~3 Line : skip명령어를 통해 bss 영역을 할당한 모습을 볼수 있다. (skip n은 n공간의 byte를 확보한다는 의미이다.)
5~6 Line : asciz와 ascii로 string을 data영역에 일정 값을 초기화시켜 저장하였다. (asciz는 string의 끝이 Zero이고 ascii는 아니다.)
7~End Line : 7번 하단으로는 모두 text Section이다. 즉 우리가 작성하는 일반적인 코드는 컴파일 시간에 할당되는 Static영역내의 text Segment에 저장되게 된다.
우왕굳 
wrote at 2010.11.10 21:25
안녕하세요~ 어셈 글 잘보고 있는데 질문있어요~~~
bss 공간에 메모리 할당하게 되면 main에서 -64만 해줘도 상관없는거죠???

그리고 함수들을 작성해서 global로 선언하게되면 이함수들은 text영역에 존재해야되나요 아님 data에 존재해야되나요???

실행해보니까 둘다 되던데 어떤게 맞는건지 잘모르겠어서요^^;;

답변부탁드려요~~~
wrote at 2010.11.13 21:16
일단 기본 개념을 잡으시면 편할것입니다.
BSS는 초기화되지 않은 영역을 뜻하며 C에서 선언만 한 변수에 해당하구요.
Global이나 static류의 것들은 모두 DATA영역에 잡히게 됩니다.~!
Text영역은 일단 직접 작성하시는 코드 부분들이 들어간다고 보시면 됩니다. ㅎㅎ
이름 :
비밀번호 :
홈사이트 :
비밀글 :
*1  *···  *28  *29  *30  *31  *32  *33  *34  *35  *36  *···  *171 
count total 591,033, today 82, yesterday 93
rss
I am
Shinlucky's Archive (171)
무언가 만들기 위한 지식 (165)
입코딩으로하는 ERROR REPORT (6)
글 보관함
2016/08, 2013/09, 2013/01, 2012/12, 2012/01,
달력
«   2019/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30