argv 인자 전달과 스택 정렬 규칙 [카드캡터 핀토스 ep.2]
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

카드캡터 핀토스 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 역순 저장 후 %rsiargv_addr 할당하여 main()에서 정확한 인자 전달 가능.