Programming from the Ground Up에 있는 소스에서 궁금한 점입니다.
1.


위에서 Stack Positions를 보면
Argument의 갯수를 0,
프로그램 이름을 4로 시작해서 올라가고 있습니다.
이는 마치 C에서 main함수의 argc와 argv[]와 같은 것이지요.
그런데 사용되는 코드를 보면
ebp가 가리키는 곳에서 8바이트 위가 argv[1]입니다.
스택 구조를 그려보면 다음과 같을 것입니다.

그렇다면 이 스택에는 return address가 없습니다.
함수 호출 시 return address가 생긴다고 배웠습니다.
물론 프로그램 실행과 함수 호출은 다른 방식이지만,
C에서 main함수가 entry point를 한 것이 익숙해서 그런지
조금 이상하다고 생각됩니다.
프로그램이 종료되면 return value를 처리해야 하므로
OS가 무엇인가를 할 듯 하나 잘 모르겠습니다.^^;;;
2.

1번에 나왔던 소스 위의 소스입니다.
file desciptors를 이용하기 위해 esp를 8만큼 빼서
빈 공간을 만듭니다.
그 후에 ebp와 ST_FD_IN과 ST_FD_OUT를 이용하여
해당 공간을 접근하고 있습니다.
처음에는 push와 pop을 쓰지 왜 저렇게 사용하나 싶었는데,
push와 pop을 쓴다면 ST_FD_IN에 접근하려면 상당히 귀찮겠더군요.^^
어쩌면 저 방법이 C에서 지역변수를 만들어 쓰는 방법이 아닌가 싶습니다.
3.

위에 소스를 보면
convert_to_upper 함수를 호출하고 나서
호출 전에 스택에 넣었던 버퍼 사이즈를 eax에 넣고 있습니다.
그 후에 파일을 쓰기 위해
버퍼 사이즈를 eax에서 edx로 복사하고 있습니다.
이럴거면 처음부터 popl %edx를 쓰는 것이 더 효율적이지 않나요?
그런데 왜 pop을 한 다음에 mov를 하는지 모르겠습니다.
다만 push를 eax 것으로 하였기에
pop 역시 eax에 해야하는 것이 보기에(?) 좋지 않나 추측해봅니다.
4.

여기서 말하는 esp는 함수 호출 때의 esp인지
위에 그림에 그려져 있는 esp인지 잘 모르겠습니다.

즉, 위의 esp인지 아니면 subl을 한 esp인지 헷갈립니다.
지금까지의 맥락으로 봐서는 후자가 맞는 듯하나
단순히 글만을 보았을 경우에는 전자가 맞는 듯 싶기도 하기 때문입니다.
참조
Programming from the Ground Up
http://wiki.kldp.org/wiki.php/DevelFilterCSkeleton#s-1.2
- 다음 문자열의 길이는? NoSyu 풀이 (6)2009/02/14
- Programming from the Ground Up - chap5 궁금점 (0)2007/03/02
- 함수 호출 종료시 esp와 ebp (0)2007/02/23
- xor eax, eax < mov eax, 0 (4)2006/04/02
- Cache에 관한 글 (0)2006/03/30
- Understanding CPU Caching and Performance 04/04 (0)2006/03/30
- Understanding CPU Caching and Performance 03/04 (0)2006/03/30
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요