작성
·
8
·
수정됨
0
안녕하세요,
섹션15. AAPCS : TRACE32 디버깅 실습 (2024년 버전) 의
119. Armv7-A: BL 명령어 실행 후 스택 Push 및 Pop 디버깅 실습 (Practice1-Part2) 강의에
3분10초쯤에서
push {r4,r5,r11,r12,r14,pc} 명령을 실행하는데, 왜 스택에 push 되는 pc 값이 C0253990 인지를 모르겠습니다.
그러니까 스택 화면(d.v 윈도우)에서 스택 주소(CC181BFC)에 push되는 값이 pc 값이 C0253990으로 확인되는데, 해당 push 명령은 C0253988 이고, 명령 실행시 레지스터 화면(r 윈도우)에서도 pc 값이 C0253988에서 C025398C로 변경되는데 스택에 push되는 pc 값은 왜 C0253990 ... 인가요 ... ?
++++
개인적으로 조사해보니...
ARMv7에서 파이프라인 성능향상을 위해 2개의 명령어를 prefetch 해놓았기 때문이라고 하는 것 같은데요 ... 그럼 trace32의 레지스터 화면(r 윈도우)의 값이 잘못되고, 스택 메모리 화면(d.v 윈도우)의 값이 맞다는걸...까요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 최민우님.
강의에서 언급된 ARM 아키텍처의 BL
명령어와 스택에 PUSH
되는 PC 값에 관련하여 설명드리겠습니다.
PUSH
명령어와 PC 값PC의 역할: ARM 아키텍처에서 PC(Program Counter)는 현재 실행 중인 명령어의 주소를 나타냅니다. 명령어가 실행될 때마다 PC는 다음 명령어를 가리키도록 증가합니다.
BL
명령어: BL
(Branch with Link) 명령어는 서브루틴 호출을 위한 것으로, 현재 주소 + 8 (파이프라인에 의해)로 계산된 다음 명령어의 주소를 LR
(Link Register)에 저장한 후에 새로운 주소로 분기합니다.
스택에 저장되는 PC 값: 스택에 직접 PC
를 PUSH
할 때는 일반적으로 명령어가 실행되기 전에 이미 PC
가 증가했기 때문에, 실제로 PUSH
되는 값은 현재 실행 중인 명령어 주소 +8이 반영된 값이 스택에 저장됩니다. 이는 ARM 아키텍처의 파이프라인과 지연된 실행 때문입니다.
강좌에서 C0253988
위치에서 명령어가 실행되었더라도, PC
는 이미 그 이후 주소(예: C0253990
)를 가리키게 되어 스택에 PUSH
될 때 해당 주소가 저장된 것입니다.
PUSH 명령어와 PC 자세한 예제: 관련 강의에서 다뤄졌을 수 있는 유사한 설명입니다.
ARM 프로세서 파이프라인 이해: 파이프라인과 관련된 질문은 프로세서의 동작 이해를 돕습니다.
혹시 더 자세한 설명이 필요하시다면 강의 내에서 추가적으로 예제를 확인하거나, 질문을 통해 지식 공유자님께 직접 질문하시는 것도 좋은 방법입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.