카드캡터 핀토스 ep.2 💬 말의 카드 : argv의 속삭임, 스택 위의 인자들
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
C/C++ 시스템 프로그래밍 개발자, 저수준 프로그래밍에 관심 있는 중급 이상 개발자
핵심 요약
argv
인자 전달 시 스택 정렬 규칙 (%rsp
는 8바이트 정렬, NULL sentinel 필수)setup_stack()
함수 구현 핵심 (역순 문자열 복사, 주소 저장 순서, 레지스터%rdi
/%rsi
할당)- 실행 오류 원인 (NULL 누락, 정렬 오류, 주소 역순 문제)
섹션별 세부 요약
1. 📚 argv의 마법과 스택 구조
main(int argc, char **argv)
에서argc
는 인자 수,argv
는 문자열 주소 배열- 스택 구조:
fake return address
,argc
,argv
,argv[0]~argv[n]
,NULL sentinel
,word-align padding
- NULL sentinel 없이
argv[argc] != NULL
로 인한 프로그램 오류 가능성
2. 🛠️ `setup_stack()` 함수 구현
- 문자열 역순 복사:
for (i = argc-1; i >=0; i--)
- 주소 저장:
arg_addr[i]
를 역순으로 스택에 푸시 - 레지스터 초기화:
if_->R.rdi = argc
,if_->R.rsi = argv_addr
3. 🐛 실수 포인트와 테스트
- 스택 정렬 오류:
%rsp
8바이트 정렬 미준수로 인한 프로그램 종료 - 인자 순서 오류:
argv[0]
보다argv[1]
주소가 높아서 프로그램 혼란 - 테스트 예시:
args-multiple
,args-dbl-space
에서 인자 수, 순서, NULL 검증
4. ✅ 테스트 결과 및 정리
args-multiple
테스트:argv[0] = 'args-multiple'
,argv[1]~argv[3]
정확히 전달args-dbl-space
테스트:argv[0] = 'args-dbl-space'
,argv[1]~argv[3]
복수 공백 처리- 성공 조건: 모든 인자, NULL, 순서, 정렬 조건 충족
결론
- 스택 정렬과 NULL sentinel을 철저히 준수해
setup_stack()
구현하고,argc
,argv
레지스터 할당 순서를 확인하세요. - 예:
setup_stack()
에서arg_addr
역순 저장 후%rsi
에argv_addr
할당하여main()
에서 정확한 인자 전달 가능.