어셈블러를 수월하기 위해서는 사실 절차적인 면에서,
Register Set과 Memory 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]
Register Set과 Memory 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에 저장되게 된다.
5~6 Line : asciz와 ascii로 string을 data영역에 일정 값을 초기화시켜 저장하였다. (asciz는 string의 끝이 Zero이고 ascii는 아니다.)
7~End Line : 7번 하단으로는 모두 text Section이다. 즉 우리가 작성하는 일반적인 코드는 컴파일 시간에 할당되는 Static영역내의 text Segment에 저장되게 된다.
'무언가 만들기 위한 지식 > SPARC Assembler' 카테고리의 다른 글
SPARC Assembler Floating Point Control (2) | 2010.04.20 |
---|---|
SPARC Assembler "Set" Instruction (0) | 2010.04.20 |
SPARC Assembler File i/o (input/output) Trap Service_파일입출력 (1) | 2010.04.19 |
디버거(Debug) Gdb사용법 (1) | 2010.04.19 |
SPARC Assembler Switch (4) | 2010.04.09 |