본문 바로가기
반응형

시스템 반도체/Arm24

Arm Memory Map ( 메모리 맵, 메모리 공간 분할, I/O ) I/O CPU는 어떻게 I/O device의 정보를 얻고 변경할까? 메인 메모리에선 ldr, str과 같은 명령어를 사용하여 정보를 얻고 업데이트하는 것처럼 I/O 장치에서는 어떻게 정보를 얻는지 궁금증이 생긴다. Arm에선 메모리든, I/O 장치든 모두 같은 명령어를 사용한다. 무슨 말이냐 하면, I/O 장치에 접근할 때도 메모리 접근 명령어와 마찬가지로 ldr, ldm을 사용하고, 업데이트할 때도 str, stm을 사용한다. 어떻게 가능할까?? 바로 Memory map을 이용하기 때문에 가능하다. Memory Map Arm CPU에서 32bit를 제공한다고 하면, 메모리 공간은 2의 32승 byte의 공간을 가진다. 말 그대로 공간이다. 어떤 것도 배정되지 않은 빈 공간을 가진다. 이 공간에 메인 메.. 2022. 4. 7.
Arm Memory Access instruction (메모리 접근 명령어, LDR, SRT, LDM, STM, Stack operation) Memory Access instruction - single-register transfer : 하나의 레지스터를 읽고 쓰는 명령어 - muitiple-register-transfer : 2개 이상의 레지스터를 한 번에 읽고 쓰는 명령어 Single-Register Transfer 1. LDR - 메모리로부터 주소를 읽어 레지스터에 저장하는 것이다. 단위는 word = 4byte이다. + 하나의 byte만 얻고싶을 땐 LDRB나 LDRSB를 사용한다. 근데 레지스터는 word 단위로 돼 있는데 byte만 가져오면 사이즈가 안맞다 이럴 땐 어떻게 해야 할까? 사이즈에 맞게 크기를 맞춰줘야 하는데 LDRB는 zero extensiong하고 LDRSB는 sign extenstion한다. 예를 들면, 아래와 .. 2022. 4. 7.
Arm Branch instruction ( 분기 명령어, B, BL ) Branch instruction signed_immed 에는 24 bit로 얼마나 떨어져 있는 곳으로 갈지 정한다. 예를 들어 아래 코드를 봤을 때, foo에서 PC인데 foo까지 얼마나 떨어졌나 보면, 4칸 떨어져 있다. 그래서 우리는 4를 인코딩해서 24bit로 채워 넣는다고 생각한다. 하지만 Arm은 조금 다르게 PC + 8가 기준이 된다. 즉, PC +8에서 얼마나 떨어졌나를 가즌으로 24bit을 채운다. 아래의 경우에는 2칸 떨어져 있으니, 2를 24bit에 넣는다. 왜 이럴까?? piplined을 생각하면 된다. 5 stage라고 했을 때. b foo의 E단계에서 이동해야 한다는 걸 알았을 때는 이미 PC + 8이 된 다다음 명령어의 Fetch가 된 상태라 그렇다. 1. B ( branch).. 2022. 4. 7.
Arm Aruthmetic instruction ( 산술 명령어, ADD, ADC, SUB, SBC, RSB, RSC, CLZ ) Data processing 중 하나인 Aruthmetic instruction을 알아보자. Aruthmetic 1. ADD - Rd = Rn + N 굉장히 단순하다. adds는 연산이 끝난 후에 nzcv flag를 업데이트한다는 차이가 있다. add r0, r1, r2 ; r0 = r1 +r2 add r0, r1, #256 ; r0 = r1 + 256 adds r0, r2, r3, lsl#1 ; r0 = r2 + (r3 2022. 4. 7.
Arm Move instruction ( 이동 명령어, MOV, MVN, MOVS ) Data processing 중에 Move instruction를 알아보자 Move Move는 ALU와 Rn을 사용하지 않는다. 즉, second soure operand만을 가지고 preprocessing 하여 Rd로 이동한다. 2가지 명령어가 존재한다. 1. MOV - 단순히 Rm을 preprocessing 하여 N을 출력하고 N이 그대로 Rd로 이어진다. (Rd = N) 예를 들어보자, MOV R0, R0, LSL#3 은 R0 = R0 * 8을 의미한다. 왜냐면 LSL은 logical shift left를 의미하니 왼쪽으로 3번 옮기면 *2^3을 하는 것과 같기 때문에 R0 * 8이라고 본다. 대표적으로 많이 쓰는 것이 MOV PC, R14이다. 언제 쓰냐면 function call로 사용한다. 함.. 2022. 4. 7.