인프런 커뮤니티 질문&답변

박진수님의 프로필 이미지

작성한 질문수

ARM Cortex-M 프로세서 프로그래밍

s211_AAPCS

push pop 질문

24.10.26 08:44 작성

·

18

1

안녕하세요 강사님 강의 듣다가 궁금한 점이 있습니다.
push {lr}

bl F11
POP {pc}

 

이렇게 동작할 때, lr값을 스택에 저장을 하고 나면 sp가 하나 증가하지 않나요? pop {pc}를 하면 스택메모리에서 현재 스택포인터가 가리키고 있는 아무것도 없는 쪽을 읽어서 pc에 저장해야되는게 아닌가요?

답변 2

0

홍영기님의 프로필 이미지
홍영기
지식공유자

2024. 10. 26. 22:36

안녕하세요. 박진수님
push {lr} 이후 sp가 증가하지 않고 감소하게 됩니다. ARM 아키텍처에서 스택 메모리는 주소를 감소시켜가면서 값을 저장하기 때문에, 스택에 값을 푸시하면 sp가 감소합니다.

pop {pc}를 수행하면 현재 스택 포인터가 가리키는 위치의 값을 pc에 로드한 후, 스택 포인터는 원래 위치로 증가하게 됩니다. 따라서 pop {pc} 이후 pc에는 정확히 반환 주소가 저장되므로 정상적인 서브루틴 리턴 동작이 수행됩니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 26. 08:46

안녕하세요, 인프런 AI 인턴입니다. 박진수님!

ARM Cortex-M 프로세서에서의 pushpop 명령어 동작에 대해 설명드리겠습니다.

push {lr} 명령어는 LR(Link Register)의 값을 스택에 저장합니다. 이때 스택 포인터 SP는 감소합니다. 이는 ARM 아키텍처가 스택을 사용하는 방식 때문입니다. ARM은 “Full Descending Stack” 형태를 사용하므로, 스택에 값을 저장할 때 스택 포인터가 감소하고 값을 가져올 때 증가합니다. 따라서 push 명령어는 SP를 감소시켜, 새로운 값이 적재될 위치를 가리키도록 합니다.

이 후에 POP {pc} 를 실행하면, 스택에서 값을 꺼내어 PC(Program Counter)에 저장하게 됩니다. 스택 포인터는 이 과정에서 증가하여, 이전에 저장된 값의 위치로 돌아갑니다. 코드에서 스택의 포인터가 적절히 조정되므로 걱정하실 필요가 없습니다.

  • 스택은 메모리의 한 부분으로, 함수 호출 시 리턴 주소 또는 지역 변수를 저장하는데 주로 사용됩니다.
  • bl F11과 같은 Branch with Link 명령어는 현재 주소를 LR에 저장하고 F11에 분기합니다.
  • 이후 POP {pc} 명령어는 LR로부터 리턴 주소를 되돌려 받아 PC에 로드하여 이전 실행 위치로 되돌아갑니다.

관련 내용을 더 깊이 이해하시려면 아래의 유사 질문 및 답변들을 참고하시면 도움될 것 같습니다:

  1. push pop 명령 및 기타 질문 드립니다.
  2. thumb2명령어와 thumb명령어가 섞여있을 때 플래시 메모리 읽기 동작

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.