해결된 질문
작성
·
494
1
강의 잘 보고 있습니다.
주소 지정 작업을 위해 기본 레지스터로 사용될 경우 왜 항상 4바이트 정렬해야하나요?
강의 마지막 부분에서 나온 예를 보면
0x08000632에서 로드 명령을 실행하는 동안 PC 레지스터는 0x08000636로 읽지만
-> 파이프라인 구조니까 0x08000632에서 실행하는 동안 PC의 값은 Thumb의 경우 +4, Thumb2의 경우 +8가 될 것으로 생각이 됩니다.
ldr...[pc]의 기본 주소는 Align(0x08000636, 4), 즉 0x08000634이다.
-> 왜 4바이트 정렬을 해야하는지 이해가 가지 않습니다.
답변 1
1
안녕하세요. 김상현님!
질문하신 내용에 대한 답변은 아래와 같은 2가지 사실의 기초 위에서 설명드릴 수 있겠습니다.
첫째, 일반적으로 Cortex-M 프로세서는 Thumb 명령어를 가져올 때 2개의 Thumb 명령어를 한 번에 가져옵니다. 그런 특징 때문에 LDR 명령어가 위치한 메모리 주소가 정렬되어있는지 여부에 따라서 PC 값은 달라집니다. 명령어가 정렬된 주소에 놓여져 있다면 PC 값은 현재 위치+4, 그렇지 않다면 현재 위치+2가 되겠죠.
둘째, 메모리를 4의 정수배의 주소로 접근할 때는 그렇지 않을 때에 비해 시간이 단축된다는 고유의 하드웨어적인 특징 때문에 PC-relative 어드레싱에서는 4의 정수배의 주소를 접근하도록 컴파일러가 코드를 만들어 내는 것 같습니다. [영상참고]s336_비정렬 액세스의 득과 실
영상에서와 같이 예를 들어보면
08000632: 16 4b ldr r3, [pc, #??]
컴파일러는 현재 LDR 명령어가 사용된 주소가 632 번지(4의 정수배 아님) 인것을 알고 #?? 이 부분을 90이 아닌 88을 선택해서 머신 코드를 만들어 낸다는 점입니다.
08000632: 16 4b ldr r3, [pc, #88]
이와 같은 내용을 염두에 두고 영상을 참고해 보시면 좋으리라 생각되고요, 사실 이 내용은 그닥 중요한 부분은 아니라고 개인적으로 생각됩니다.