Thief of Wealth




- 어셈블리어는 C 컴파일러가 컴파일 하기 때문에, 결국엔 C코드를 최적화 하는 것이 필요하다.


그리고 C프로그램을 짤때, 자료형은 32bit형 int를 써주는것이 좋다.

왜냐하면 ARM의 레지스터의 길이는 32bit인데, 

32bit가 아닌 경우, 어셈블리어쪽에서 32bit로 바꿔주는 연산이 추가로 필요하기 때문이다.



- Load 명령어 주소지정방식 3가지


1. Pre indexing


LDR r0, [r1, #4] 형태로 쓴다.


이것의 의미는 r0에 [r1+4]인 값을 저장하겠다는 의미이다.

그러면 r0값을 바뀔것이나

r1의 값은 그대로 일 것이다.


2. Post indexing


LDR r0, [r1], #4


이것도 의미는 r0에 [r1+4]인 값을 저장하겠다는 의미이다.

그러면 r0값도 바뀌고

r1의 도 4가 더해진 상태로 업데이트 된다.



3. Pre indexing with write-back


LDR r0, [r1, #4]!


이것의 의미는 r0에 [r1+4]인 값을 저장하겠다는 의미이다.

그러면 r0값을 바뀌고

r1의 값도 4가 더해진 상태로 업데이트 된다.

pre indexing이랑 형태를 유사하나 !가 붙는다는 점이 다르다.



- ARM의 브랜치 명령어 (복습)
-B
점프하는데 복귀할 주소없이 저장.
pc = label
-BL
점프하는데 복귀할 주소를 저장한후에 점프. 그리고 끝나면 다시 원래다음자리로 복귀함.
pc = label // 다음명령어는 label태그 있는곳
lr = address // 링크 레지스터에 복귀할 주소저장
label수행후 복귀



- ARM에서 각 레지스터의 용도


ARM은 레지스터가 몇개다?

37개다.


유저모드 30개, pc1개, CPSR1개 SPCR 5개로 구성되어있다.


근데 만약에,


지역변수가 30개를 넘어서 레지스터가 모든 값을 저장하지 못하면 어떻게 될까/

=> 초과되는 변수들을 스택구조로 저장하면된다.

이것을 Spilled or Swapped Out 라고 부른다.


이것은 인수를 넘길때도 반영된다.

인수는 기본적으로 최대 4개를 보낼 수 있다.

근데 인수를 4개초과로 보내려면, 그때 스택구조로 인수를 보내는 것이다.


스택은 되도록안쓰는것이 오버헤드가 적다.


그래서 인수4개를 1개처럼 보이게 구조체로 넘기면 스택사용으로 인한 문제점을 해결 할 수 있다.


구조체로만 하면 다 해결되느냐?


1. 구조체로 할때

스택을 안써도된다.

그러나 스택에서 멤버변수를 불러오기위한 포인터연산이 필요하다.

그리고 복잡하다


2. 인수 4개넘어도 구조체안쓰고 스택으로 할때

오버헤드가있다.

포인터연산따위 없다.

겁나 간단하다.


이런 장단점들이 있다.


- ATPCS : C에서 함수 호출시 주고 받는 형식에 대한 규칙을 뜻한다.


r15는 pc를 저장하는데에 쓰이고

r14는 링크 레지스터로 쓰이고

r13는 스택포인터로 쓰이고

r10은 지역변수 저장하는 스택의 한계점의 위치에 쓰이고



r0, r1, r2, r3는 인수넘길때 사용되고

인수 4개 넘으면 5번째부터 스택에 저장해서 보냄


r0는 return값을 저장하는데에도 쓰인다. (분석해보면 함수 리턴값은 항상 r0에 들어있음)

근데 리턴값이 32bit초과 할 정도로 크면 r0,r1로 표현해서 보낸다.

또, r0는 일반용으로도 사용되기도 한다. 


MIPS라는 구조는 리턴용과 인수용 레지스터가 따로있는데 ARM는 레지스터 수가 작아서 이렇게 쓰는 것이다.




(참고) printf("%d", 123);

같은 명령어는 r0에 "%d"가 r1에 123이 맵핑된다.


'개발 > 마이크로컴퓨팅' 카테고리의 다른 글

6. ARM 명령어  (0) 2019.04.18
5. ARM 디버깅  (0) 2019.04.18
4. ARM 프로세서에 대해 2  (0) 2019.04.18
3. ARM 프로세서에 대해  (0) 2019.04.17
2. ARM은 뭘까  (0) 2019.04.17
profile on loading

Loading...