[asm] 스택의 크기를 사용가능한 메모리의 크기보다 1 더 크게 잡아도 문제가 없는것인가요?
글쓴이: gurumong / 작성시간: 수, 2009/07/29 - 11:07오전
MS-DOS에서 어셈블리어를 공부하고있습니다
공부를 한지 얼마 안되지 않는데요
스택의 크기를 잡을때에 대해서 궁금한점이 생겼습니다
초기에 SP는 스택의 크기값을 주소로 가지고
SP가 0이되면 스택이 가득찬것이고
스택의 꼭대기는 사용할수없는것으로 알고있습니다
그런데 사용가능한 자신의 메모리의 관점에서
스택의 크기를 사용가능한 메모리의 크기보다 1 더 크게 잡아도 문제가 없는것인가요?
이 경우에 자신과 상관없는 이웃하는(?) 메모리의 번지를 SP가 가르키게 되는데요
아니면 항상 SP가 자신의 메모리의 번지만을 가르킬수 있도록
스택의 크기를 최대 자신의 메모리의 크기만큼 잡는것이 관례인가요?
어셈블리어가 재미있는거 같습니다~
Forums:
사용 가능한 메모리의 크기보다 1 더 크게 잡는다는 것이 정확히 무슨 의미인지 모르겠습니다만...
MS-DOS에서는 conventional memory를 초과하여 SP를 설정할 수 없습니다.
(conventional memory는 최대 640KB인데 register는 16비트라서 최대 64KB까지만
지정할 수 있기 때문입니다)
만약 1 더 크게 잡는다는 것이 0xFFFF + 1 (= 0)을 의미하는 것이라면 그렇게 해서는 안됩니다.
push나 pop 명령은 스택 오버플로우나 언더플로우가 발생하는 것에 관계 없이 값을 쓰기
때문에 SS:[0]에 값을 집어 넣으려는 의도가 아니라면 SP를 0으로 설정해서는 안됩니다.
그리고 x86 real mode의 스택 포인터는 2바이트 단위로 증감하므로 최대 0xFFFE에서 시작합니다.
그러니까 패러그래프
그러니까 패러그래프 경계상이면 어느곳이나 세그먼트가 위치할수 있잖아요
0x002f 까지 스택 세그먼트에서 사용하고 인접한 0x0030 에는 다른 세그먼트(code나 data 세그먼트)가 위치할때
스택의 꼭대기는 사용할수 없으니까 SP의 초기 값은 0x0030 이 되어도 상관없는것인가요?
아니면 SP이 가르키는 번지가 항상 자신의 영역만 가르키도록 최대 0x002f 를 가르키도록 하는것이 관례인지...
공부가 얼마되지 않아서 질문이 정상적인지도 모르겠고; 설명도 잘 못하겠네요 ㅜ.ㅜ
뒤에 다른 paragraph가 중첩되어 있다고 하면 그렇게 쓸 수는 있을 겁니다.
앞에서도 언급했듯이 x86 real mode의 push나 pop 명령에서 중첩된 paragraph에 대해
underflow를 검출할 방법은 없습니다. 따라서 사용자가 문제없이 사용할 수 있다면
0x0030이 다른 세그먼트를 가리키고 있다고 하더라도 상관은 없습니다.
그런데 MS-DOS를 기준으로 한다면 SS는 항상 실행 이미지의 가장 마지막 주소에 위치하고
있으며 SP는 최대치로 잡혀 있습니다. 따라서 0xFFFE 같은 주소가 나오는 것입니다. (0으
로 하면 stack overflow를 검출할 방법이 없으니 그렇게 하는 것입니다)
댓글 달기