본문 바로가기
코스웨어/15년 스마트컨트롤러

20151127 - 권오민 - ARM ASSEMBLY 2일차

by 알 수 없는 사용자 2015. 11. 27.
728x90
반응형

ARM ASSEMBLY

◆2.Microprocessor 아뜰리에 - ARM을 파헤쳐 보자

◉6.ARM Exception과 Modes(P.123)

Software 실행 중, Exception이 발생(P.127)

- 고려해야 할 것들.

        - 1) Exception mode가 발생 한 후, 이전 mode로 돌아갈 수 있어야 한다.

        - 2) 지금 쓰던 Register 값들을 다시 사용할 수 있어야 한다.

                - 이전에 쓰던 Context를 다시 복원할 수 있어야 한다.

        - 3) 이전 mode로 돌아갔을 때 원래 수행 하던 곳으로 돌아 갈 수 있어야 한다.

        - 4) 그리고 자동으로 해당 Exception Vector로 이동해야 한다.

- Exception에 발생에 의한 하드웨어적인 처리.

        - 1) CPSR(SVC)을 SPSR_irq에 복사한다.

        - 2) CPSR의 mode를 IRQ로 변경, 결과적으로 stack pointer도 IRQ mode의 stack pointer로 변경한다.

        - 3) IRQ disable 함, ARM mode로 변경한다.

                - ARM mode로 변경

                        - Exception이 발생하면 무조건 32bit ARM mode로 ARM state가 바뀐다.

                        - IRQ disable하는 법

                                - CPSR의 I bit를 1로,  ARM mode도 T bit를 0으로 setting하면 된다.

        - 4) R14_irq := 현재 PC

        - 5) 그러고 나서 어떤 일이? IRQ Exception Vector 주소인 0x12로 가야 한다.

                - PC : = 0x12 이에요.

- Exception에 발생에 의한 소프트웨어적인 처리.

        - 6) R0~R12를 R13_irq (stack pointer)가 가리키는 stack에 저장한다.

        - 7) 돌아갈 주소를 보정합니다.

                - R14_irq (LR) = PC

                        - interrupt 걸린 순간에는 pipe line에 의해서 2개 opcode가 이미 진행되었으니까, sub     lr, lr, #4   처럼 lr을 보정해야 한다.

- Exception 처리

를 다하고 돌아갈 때는? - backup 했던 넘들을 다시 가져오면 되겠죠. 이건 Software 적으로 알아서 해줘야 해요. 올 때는 자동으로 와도, 갈 때는 편의를 봐주지 않아요. 젠장찌게.

- 위의 과정들을 그림으로 표현하면 다음과 같다.


- arm은 accumulator가 없다.

        - 반대로 말하면, 대부분의 레지스터가 accumulator이다.

- : 파스칼

- R0~R3을 다시 사용하면, 오염되었을 수 있다.

        - 함수에 결과에 의해 값이 보장되지 않고 변한다.

        - 다시 사용하려면, 백업을 하고 사용해야한다.

        - 인텔의 경우 eax만 변한다.

                - 나머지는 변하지 않는다.

- AAPCS에 의한 레지스터 사용법

        - Register뿐만 아니라 Synonym, Special로 표기해도 인지가 가능하다.

- 레지스터의 용량을 초과하는 경우도 있다.

        - 예를 들어 구조체의 경우 1개씩 차곡차곡 복사한다.

                - 중간 파일을 생성해서 확인할 수 있다.

                - Visual Studio로 확인할 수도 있다.

                - 가능하면 주소로 복사하여 사용하는 게 좋다.

- 함수의 인자 4개, 내부변수 7개까지는 레지스터에 할당된다.

        - 4byte기준이다.

        - 넘게 되면 stack에 저장 후에 사용해야하며, 끝나기 전에 복원도 해주어야 한다.

                - 매우 번거롭다.

728x90