|
이정우~ 님이 쓰신 글 :
: 우선 바쁘신데 항상 친절한 답변감사합니다 ^__________^;
:
:
: void ()
: {
: int k;
: int *xx ;
: k=3-2 ;
: xx=&k ;
: }
:
: 이프로그램 켐파일 되고 난후 실행파일로 만들어 작동할경우
:
: 램에서 데이타영역과 프로그램코드영역으로 나누어져 실행되는것
: 은 분명하겠죠.!!
:
: 그럼 램 속안을 관찰해 보면~!!
:
: 램에 데이타영역이나 프로그램코드 영역이나 메모리이기때문에
: 솔직히 주소가 있고 그안에 정보들이 입력되어 있겠죠.
:
: 질문 ) 메모리 일정 주소(코드영역)에 정보 int 같은 경우 2바이트
: 할당/정수사용에 의미를가지고 있고 변수명 k는 데이타영역에 첫번째
: 주소가 저장(리맵핑) 되는것인가요?? yes.no?
답변1) 코드영역에는 코드랑 데이터의 주소정보만 있을 것 같은데요.
32비트 환경(윈도2000이나 XP, 윈도98)에서는 int는 4바이트입니다.
변수명 K는 자동변수이기 때문에 스택영역에 할달되어서 결과값 1을 가리키고 있지 않을까요.
:
: 질문2) 메모리에 일정주소(코드영역)에 정보 int * 같은 경우 2바이트할당/
: 주소다 의미를가지고있고 변수명 xx는 데이타 영역에 첫번째주소가
: 저장되는것인가요 ?? yes no ?
:
답변2) 포인터 변수도 스택에 할당되는 것으로 압니다. 그곳에는 초기화되면서 원래부터 들어있던
쓰레기값이 들어있겠죠. 크기는 역시 주소를 저장하기 때문에 4바이트가 되어야 할 겁니다.
당연히 주소를 가르킬 경우는 그 첫번째 주소만 가르킵니다. 그러면 그 크기는 어떻게 알까요? 데이터 타입이 4바이트면 내부적으로 하나를 읽을때 4바이트씩 읽겠죠.
: 질문3)위에 예에서 선언이후에
:
: int k=3-2 ;
: int *xx= &int k ;
:
: 이런 형식으로 쓰지 않는것은 같은글을 또쓰고 또쓰고 노가다 작업을
: 피하기 위하여=데이타형 중복쓰는것을 피하기 위하여 프로그램
: 코드작동 범위=데이타형 작동범위를 선언에서 지정하는것아닌가요 ?
: yes. no?
:
: 그 긴 프로그램 문장마다 데이타형~다 쓰면 얼마나 노가다입니까?
:
답변3) 포인터는 주소만 저장되는 작은 변수입니다.
포인터를 사용하는 이유는 전역 변수가 아닐 경우 함수 매개변수나 결과값으로
처리된 데이트를 받거나 넘길때 오버헤드가 일어나는 것을 막이 위함이고,
데이터형이라는 것은 노가다랑 상관이 없는 것인데요.
:
: 질문4) k=3-2 일 경우 데이타영역은 어디이고 프로그램영역은 어디
: 일까 의문점인데?
:
: 3-2경우에 3,2는 데이타영역에 있고 그러니 당연히 그 위치=주소를가지고 있고
:
: 메모리에 일정주소(프로그램코드 영역)에는 방에는~ 내용에는
: 3이나 2에 주소를 가지고있나요?
:
: why 그래야지 프로그램이 실행되면서 데이타영역에 3.2에 위치를 찾죠!
:
:
답변4) 프로그램영역은 상수 3-2를 해서 그 결과를 K변수에 넣으라는 것 자체입니다.
데이터영역은 상수 3, 2랑 변수 K 그것일 겁니다.
맞습니다. 상수도 주소가 있고 그 값에 이름부혀질 변수도 주소를 가지고 있죠.
CPU에서 데이터를 저장할 수 있는 공간이 있는 것으로 압니다.
고속 연산이 그곳을 이용한다고 들은 기억이 나는데...
허접한 내용이지만 제가 느끼는 질문에 대한 답변은 이게 다군요.
틀린 부분들이 많을 것입니다. 저도 어셈블리쪽은 잘 모르거든요.
물어보는 내용들이 그쪽 영역으로 보이는군요.
위의 것을 접어두고서 현재 사용되는 프로그램 내장방식은 데이터나 코드를 메모리에 올려놓고서
그것을 읽어다가 사용하는 것으로 알고 있습니다.
당연히 코드도 데이터도 메모리에 올라와 있겠죠.
프로세서에 코드를 한줄씩 대입하면서 처리시키면, 그 코드 속에는 처리할 데이터들이 어느 주소에
있는데 어떻게 처리 해라는 지시만 있고 그것들을 처리하기 위해서 데이터 입출력이
일반적으로 스택 혹은 힙이라는 데이터 저장공간에서 이루어지는 것으로 아닐까요.
갑자기 어셈이 막 생각납니다.
코드 세그먼트, 데이터 세그먼트, 스택 세그먼트, 또 뭐가 있죠?
:
:
:
:
:
:
:
:
:
:
:
|