작성
·
22
·
수정됨
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 윈도우)의 값이 맞다는걸...까요?
답변 2
0
Armv7-A 아키텍처(A32 상태)에서 pc를 읽어서 push하는 명령어를 실행할 때, pc는 현재 실행 중인 명령어의 주소에 대응되지 않습니다. 대신, 현재 명령어 주소의 + 8바이트의 값에 대응됩니다.
이 +8 바이트 오프셋은 Arm 파이프라인 구조 때문입니다. 명령어가 실행 중일 때, 명령어 페치(Fetch) 단계에서는 이미 다음 두 개의 명령어(8바이트 앞) 를 가져와 놓은 상태이기 때문입니다.
아래는 TRACE32 시뮬레이터를 사용해서 - 일부러 C023F8FC 주소의 명령어를 'push {pc}' 명령어로 바꿔서, 실행한 결과 화면입니다.

스택에 C023F8FC이 아닌, C023F904(C023F8FC + 0x8) 데이터가 푸시됩니다.
Armv7-A 아키텍처에서는 PC를 읽을 때 현재 명령어보다 8바이트 앞선 주소로 확인됩니다.
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 프로세서 파이프라인 이해: 파이프라인과 관련된 질문은 프로세서의 동작 이해를 돕습니다.
혹시 더 자세한 설명이 필요하시다면 강의 내에서 추가적으로 예제를 확인하거나, 질문을 통해 지식 공유자님께 직접 질문하시는 것도 좋은 방법입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.