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 인턴입니다. 박진수님!
ARM Cortex-M 프로세서에서의 push
와 pop
명령어 동작에 대해 설명드리겠습니다.
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
에 로드하여 이전 실행 위치로 되돌아갑니다.관련 내용을 더 깊이 이해하시려면 아래의 유사 질문 및 답변들을 참고하시면 도움될 것 같습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.