ARM_기초
2019-09-20 / JSec

목차

  • ARM (Advanced Risc Machine)
  • Thumb 모드 / ARM 모드
    • ARM Instruction
    • Thumb Instruction
  • ARM 레지스터
  • ARM Intruction
  • ARM Assembly
    • Branch Instruction (분기 명령)
    • LDR and STR Instruction (단일 데이터 이동명령)
    • LDM and STM Instruction (여러개의 데이터 이동명령)
  • 콜링 컨벤션
  • 레퍼런스
  • 문서 역사

ARM (Advanced Risc Machine)

RISC를 사용하는 대표적인 언어중 하나이며 임베디드 장비에 많이 쓰인다.

  • RISC (Reduced Instruction Set Computer)

    • CPU 명령어의 개수를 줄여서 CISC 방식보다 구조를 간단하게 한 것

    • 32비트로 명령어의 크기가 동일하다. (고정길이 명령)

    • 대표적으로 arm, mips에서 사용한다.
  • CISC (Complex Instruction Set Computer)

    • 명령어의 수가 많고 처리하는 시간이 길어서 대기 시간이 길다.
    • 대표적으로 x86에서 사용한다.


Thumb 모드 / ARM 모드

ARM에는 두가지의 명령어 체계가 존재한다. 명령어가 16bit인 것도 있고 32bit인 것도 있다. 32bit 명령어를 ARM Instruction 이라고 하고 16bit 짜리 명령어를 Thumb Instruction 이라고 한다.

컴파일러가 CPSR의 5번째 bit인 T flag를 참조해서 ARM 모드인지, Thumb 모드인지 판단해서 적용시킨다. BX / BLX 명령을 이용해서 모드 전환이 이루어지며 Branch를 수행한다.

  • ARM Instruction
    • 처리속도를 우선시 할 때 사용
      • ARM은 32bit 프로세서이며 16bit 명령어를 처리하기 위해선 처리 과정을 한 번더 거치게 된다. (즉, 효율성이 감소)
  • Thumb Instruction
    • 코드 길이를 줄일때 사용
      • ARM 모드로 작성한 프로그램의 크기의 70%밖에 되지 않는다.
      • 셸코드를 작성할 때도 당연히 바이트 수를 줄이기 위해 Thumb 모드를 사용하는게 좋다.


ARM 레지스터

  • R0 ~ R10: 범용레지스터로서 연산 및 임시 저장 장소 등으로 사용 (Thumb Mode는 R7까지 사용)
    • R0: 함수의 반환 값을 저장, 함수의 첫 번째 인자 저장
    • R1: 함수의 두 번째 인자 저장
    • R2: 함수의 세 번째 인자 저장
    • R3: 함수의 네 번째 인자 저장
    • R7: Thumb mode에서 syscall number를 저장
  • R11 ~ R15: 특수한 목적으로 사용
    • R13: SP(Stack Pointer), 현재 스택의 최상단의 주소를 저장
    • R14: LR(Link Register), 복귀 주소(return address)를 저장
    • R15: PC(Program Counter), 다음 실행할 명령의 주소를 저장
  • PSR: 상태 레지스터
    • SPSR: 모드가 변경될 때 마다 변경되기 전의 CPSR을 저장
    • CPSR: 현재 동작중인 프로세서의 상태를 저장
      • 1568717584116
        • N: 연산 결과가 음수일 경우
        • Z: 연산 결과가 0인 경우
        • C: 연산 결과에서 자리올림이 발생한 경우
        • V: 연산 결과가 overflow가 발생한 경우


ARM Intruction

  • Load / Store 구조를 사용

    • ARM은 메모리 내의 데이터에 직접 접근이 불가능
    • LDR, STR과 같은 명령을 통해서 메모리와 레지스터 사이에 데이터를 전송
  • 3-Address data Processing

    • 1568719174865
    • 두 개의 source operand와 result operand를 사용
    • result 위치엔 항상 레지스터가 오고 OP 자리엔 레지스터 또는 상수
  • 모든 명령어는 조건부 실행 가능

    • CPSR 레지스터에 Condition Flag 정보에 맞춰서 분기 (N, Z, C, V)
    • ARM의 모든 명령어는 조건필드를 가지고 있고 조건에 따라 실행 여부를 결정
      • Ex) ADDEQ r0, r1, r2 ; if Z=1, then r0 = r1 + r2
    • 명령어의 접미사
      • 1568967362291

ARM Assembly

  • Branch Instruction (분기 명령)
    • B (Branch)
      • 사용법: B 주소
      • B 명령어 뒤에 지정된 주소로 분기하는 명령
      • x86의 jmp와 유사
    • BL (Branch with Link)
      • 사용법: BL 주소
      • BL 명령어 뒤에 지정된 주소로 분기하되 복귀 주소를 R14에 저장
      • x86의 call과 유사
    • BX (Branch indirect)
      • 사용법: BX 레지스터
      • BX 명령어 뒤에 지정된 레지스터로 분기하는 명령
    • BLX (Branch indirect with Link)
      • 사용법: BLX 레지스터
      • BLX 명령어 뒤에 지정된 레지스터로 분기하되 복귀 주소를 R14에 저장
  • LDR and STR Instruction (단일 데이터 이동명령)
    • LDR (Load register)

      • 사용법: ldr 레지스터, 메모리
      • 메모리에서 4byte 읽어서 레지스터로 복사하는 명령
    • STR (Store register)

      • 사용법: str 레지스터, 메모리
      • 레지스터의 값을 메모리에 4byte 만큼 복사하는 명령 (복사 방향 주의)
    • LDR, STR의 접미사

      • H: 2byte
      • B: 1byte
      • 그냥 사용하면 4byte로 동작하고 LDRH, STRB와 같이 2byte, 1byte씩 동작가능
    • pre-indexed와 post-indexed

      • pre-indexed

        • LDR R0, [R1, #0x8]과 같이 오프셋이 대괄호안에 들어가있는 경우
        • 기준 레지스터(예시에서의 R1)로부터 오프셋만큼 떨어진 주소에서 4byte 만큼 복사
        • 기준 레지스터의 값은 변하지 않음.
        • 끝에 !를 붙히면 기준 레지스터의 값이 변함. (LDR R0, [R1, #0x8]!)
      • post-indexed

        • LDR R0, [R1], 0x8과 같이 오프셋이 대괄호밖에 있는 경우
        • 기준 레지스터(예시에서의 R1)에서 4byte만큼 복사 후 기준 레지스터 값을 오프셋 만큼 변경
  • LDM and STM Instruction (여러개의 데이터 이동)

    • LDM (Load Multiple Register)
      • 사용법1: LDM?? 메모리, {레지스터, 레지스터, ...}
      • 사용법2: LDM?? 메모리, {레지스터-레지스터}
      • 메모리에 있는 값을 레지스터로 복사하는 명령이다. (복사 방향 주의)
      • 무조건 워드(32-bit) 단위의 복사만 존재한다.
      • 레지스터를 표현할때 쉼표(,)로 쓰면 특정 레지스터를 의미하고 하이픈(-)을 사용하면 연속된 레지스터를 참조하는 것이다. (R1-R3 이라면 R1, R2, R3과 동일)
    • STM (Store Multiple Register)
      • 사용법1: STM?? 메모리, {레지스터, 레지스터, ...}
      • 사용법2: STM?? 메모리, {레지스터-레지스터}
      • 여러개의 레지스터 값을 메모리로 복사하는 명령이다.
      • 마찬가지로 워드(32-bit) 단위의 복사만 존재한다.
    • LDM과 STM의 어드레싱 모드 (LDM과 STM의 접미사)
      • IA: 연산 이후 메모리 값(베이스 레지스터)을 한 워드 증가
      • IB: 연산 이전에 메모리 값을 한 워드 증가
      • DA: 연산 이후에 메모리 값을 한 워드 감소
      • DB: 연산 이전에 메모리 값을 한 워드 감소


콜링 컨벤션

  • R0 ~ R3 까지 순서대로 인자를 저장
  • 인자가 5개 이상이면 스택을 사용
  • 함수의 반환 값은 R0을 사용
  • BL 또는 BLX를 사용할 때 복귀 주소를 R14 레지스터에 저장


레퍼런스

http://blog.daum.net/goldhjw/7406090

http://trace32.com/wiki/index.php/Cortex-M

https://dreamlog.tistory.com/121

https://drive.google.com/file/d/0B_sx6nhKufWqRTdZemNETVhxVWM/view


문서 역사

2019-09-20 JSec: 최초 작성