2. ARM Assembly

손지웅·2025년 5월 19일

Embedded Software

목록 보기
3/7

Topics

Cortex-M4 Instruction Set : ARM Cortex-M4 프로세서에서 사용되는 명령어 집합. Thumb-2 아키텍쳐 기반으로 코드 크기를 줄이면서도 높은 성능을 제공한다.

Assembly Programming : 저수준 언어로 소프트웨어를 작성하는 방법

ARM 프로세서 명령어 세트의 발전

ARM 버전명령어 세트특징
~ ARMv4ARM32비트 명령어만 존재. 모든 명령어가 32비트 길이이므로 코드 크기가 큼.
ARMv4T ~ ARMv6ARM + ThumbARM: 32비트 명령어
Thumb: 16비트 명령어
Thumb 도입으로 코드 크기 및 메모리 사용 최적화.
두 명령어 세트 전환 가능(전환 시 오버헤드 및 일부 기능 제한 존재).
ARMv7ARM + Thumb2Thumb2: 16비트와 32비트 명령어 모두 포함. 코드 크기와 성능을 동시에 최적화.
  • Thumb-2 명령어 세트 : Cortex-M3,M4에서 사용
    - 16비트와 32비트 명령어를 모두 포함.
    • 기존의 명령어 세트가 가지고 있던 문제점인 32비트 명령어의 코드 사이즈 증가와 16비트 명령어의 부족한 성능, 32비트와 16비트간의 전환에 따른 성능 저하의 문제를 모두 해결

ARMv7-M 코어 데이터 타입

ARMv7-M 지원 데이터 타입

  • Byte : 8비트 (char)
  • Halfword : 16비트
  • Word : 32비트 (대부분의 연산 단위)
    ARMv7-M 프로세서는 8비트, 16비트, 32비트 크기의 데이터를 모두 다룰 수 잇다.

프로세서 레지스터들은 모두 32비트

레지스터 : CPU 내부의 빠른 임시 저정소
즉 CPU가 실제로 데이터를 처리할 때는 항상 32비트 단위로 작업한다.

ISA에서 지원하는 데이터 타입

  • 32비트 포인터 : 메모리의 주소를 32비트 크기로 표현
  • unsigned, signed 32비트 정수
  • unsigned 16비트 또는 8비트 정수 (zero-extended 형식) -> 작은 크기의 정수를 32비트로 확장할 때 상위 비트를 0으로 채워서 확장
    - 0x7F -> 0x0000007F
  • signed 16비트 또는 8비트 정수 (signed-extended 형식) -> 부호가 있는 작은 정수를 32비트로 확장할 때 맨 앞 부호비트를 복사해서 나머지 상위 비트를 채움
    - 0xFF -> 0xFFFFFFFF
  • unsigned 또는 signed 64비트 정수 (두 개의 레지스터에 저장) -> 64비트는 32비트 레지스터 두 개를 묶어서 저장하고 처리

다양한 크기의 데이터를 효율적으로 처리할 수 있도록 설계되었다.

어셈블리 코딩 용어 정리

Main MOV r0,#0 ; move 0 int R0

Label

  • 코드 내 특정 위치(명령어, 데이터)에 이름을 붙여주는 역할
  • 분기문, 반복분, 함수 진입점 등에서 해당 위치를 참조할 때 사용
  • 해당 코드에서는 Main이 레이블이다. B Main 등과 같이 분기 명령어에서 해당 위치로 점프 가능

Mnemonic

  • 사람이 읽기 쉬운 형태로 작성된 명령어
  • MOV (Move), LDR (Load Register), ADD (Add)

Directive

  • 어셈블러에게 특별한 작업을 지시하는 명령

  • AREA
    - 프로그램의 영역 선언

  • ENTRY
    - 프로그램의 시작점 선언

  • EQU
    -상수나 값을 레이블과 연결
    -MAX_SIZE EQU 100 : MAX SIZE = 100

  • END
    - 프로그램 소스의 끝을 알림

  • DCB ( Define Constant Byte )
    - 8비트 크기의 상수 데이터를 메모리에 정의, 프로그램 시작 시 메모리에 초기값을 저장할 때 사용

  • DCW ( Define Constant Word )
    - 16비트 크기의 상수 데이터를 메모리에 정의

  • DCD ( Define Constant Data )
    - 32비트 크기의 상수 데이터를 메모리에 정의

상수 데이터를 메모리에 정의한다는 의미 : 프로그램이 실행될 때 변하지 않는 값을 메모리에 특정 위치에 미리 저장하고, 필요할때 쓴다는 뜻. 주로 하드웨어 설정 값 등

Operands

  • 피연산자, 명령어가 동작할 대상
  • 레지스터, 상수, 메모리 주소 등이 온다.
  • r0, #0 에서 r0는 목적지 레지스터, #0은 소스이다. 즉 r0 레지스터에 0을 넣는다.

사용 가능한 문자

어셈블리 코드에서 사용할 수 있는 다양한 데이터

  • 십진수
  • 16진수
  • 2~9진수 ( 5진수의 경우 5_204 )
  • 소수점이 있는 실수 ( 부동소수점 )
  • TRUE, FALSE
  • 문자
  • strings

ELF sections, AREA directive

ELF section

  • 서로 독립적으로 분리된 코드 또는 데이터의 영역. 각 section은 메모리에서 서로 다른 목적으로 사용된다.
    - .text section : 실행 가능한 코드 (함수, 명령어 등)
    • .data section : 초기값이 있는 데이터 (전역 변수 등)
    • .bss section : 초기화되지 않은 데이터, 데이터가 저장되는 영역 (0으로 채워짐)

컴파일/어셈블 이후 바이너리 이미지의 구성

  • 바이너리 이미지는 하나 이상의 code section과 하나 이상의 data section으로 구성된다.
  • 하나 이상의 code section (.text) -> read-only section
  • 하나 이상의 data section (.data, .bss)-> read-write section

section의 배치와 링커의 역할

  • linker : 여러 소스 파일에서 만들어진 section들을 설정 파일의 규칙에 따라 메모리 (binary file)에 배치
  • 코드 (.text) -> 플래시 메모리
  • 데이터 (.data) -> RAM
  • 적절히 배치하여 메모리 효율을 높이고 최적화 가능

AREA directive

  • section을 정의하는 명령어
AREA Example, CODE, READONLY  ; Example이라는 이름의 읽기 전용 코드 섹션 정의
  • Example : 섹션 이름
  • CODE : 코드 영역임을 지정
  • READONLY : 읽기 전용 속성
  • AREA 이름을 숫자로 시작할 때는 , |1_dsection| 처럼 막대로 둘러싸야 함.

어셈블리 코드의 구성

AREA   ARMex, CODE, READONLY   ; 코드 섹션 정의 (이름: ARMex, 코드, 읽기 전용)
ENTRY                        ; 프로그램 진입점 지정
EXPORT ep1                   ; ep1 심볼을 외부에 내보냄(링커가 찾을 수 있게)
ep1                          ; 레이블(실제 코드 시작 위치)
    ; code                   ; 실제 명령어가 들어갈 자리
END                          ; 소스 코드 끝

Thumb-2 Instruction Set

Thumb ISA 대폭 확장 -> Thumb-2

  • 기존 ARM ISA의 거의 모든 기능을 구현하기 위해, 32bit 인스트럭션을 추가했다.
  • 기존의 16비트 Thumb 인스트럭션은 유지
  • 따라서, Thumb 코드 밀도를 유지하면서 ARM ISA의 성넝을 확보했다. ISA간 전환이 없으며 컴파일러가 자동으로 16 or 32비트 인스트럭션을 선택

Thumb-2

  • 16 or 32비트 instruction
  • Opcode 끝에
    - .W : 32비트 Thumb-2
    • .N : 16비트 Thumb
    • .S : 플래그를 세팅하라
  • ADDS R0, #1 : 16비트 or 32비트 명령어 중에서 어셈블러가 자동으로 선택
  • ADDS.N R0 #1 : 16비트 Thumb 명령어로 지정, 디폴트로 16비트 사용
  • ADDS.W R0, #1 : 32비트 Thumb 명령어

ARM/Thumb Instructions

ARM/Thumb 명령어의 주요 분류

  1. Branch Instruction 분기 명령어. B, BL, BX
  2. Data Processing Instruction 데이터 처리 명령어. ADD, SUB, AND
  3. Register load/store instruction 레지스터 로드/스토어 명령어. LDR, STR
  4. Multiple register load/store instruction. LDM, STM
  5. Status register access instruction. 프로그램 상태 레지스터 접근 명령어. PSR
  6. Coprocessor instruction. 보조 프로세서 제외, 부동소수점 연산

Branch Instruction

분기 명령어의 종류와 특징

명령어용도분기 주소 지정 방식추가 기능
B단순 분기즉시값(label)-
BL분기 + 리턴주소 저장(call)즉시값(label)LR(r14)에 복귀주소 저장
BLX분기 + 리턴주소 저장 + ISA 전환즉시값/레지스터LR(r14), ISA 전환
BX레지스터 값으로 분기 + ISA 전환레지스터ISA 전환
BXJ레지스터 값으로 분기 + Jazelle 전환레지스터Jazelle 실행

즉시값 ( Immediate Value) : 명령어에 직접 적혀 있는 값

MOV R0, #10   ; R0에 10을 저장
B   Loop      ; Loop이라는 위치로 분기(점프)

#10, Loop 처럼 값이나 주소가 명령어에 바로 들어가 있음

레지스터 값 : 레지스터에 저장된 값을 사용

BX R3         ; R3에 들어있는 주소로 분기(점프)

ISA -> insturction set architecture

함수 호출 subroutines

함수 호출과 복귀가 어떻게 이루어지는가?

2단계로 함수 구현

  • 리턴 주소를 저장 : 함수 호출이 끝나고 다시 돌아올 주소를 지정
  • 함수가 저장된 목표 주소로 분기 : 호출할 함수의 주소로 프로그램의 흐름 분기
  • 리턴 주소를 LR(Link Register, R14)에 저장
  • 지정한 함수의 시작주소로 분기

LR 레지스터 활용

  • 함수 실행이 끝나면, BX lr 명령어 사용 -> LR 레지스터로 저장된 주소로 분기

예시

void func1(void) {
    ...
    func2();
    ...
}

어셈블리 흐름
func1 내부에서 BL func2 명령어 실행 -> 리턴 주소를 LR에 저장
func2 내부에서 함수가 끝나면 BX lr 실행 -> func1의 다음 명령어로 복귀

BL and BLX

Branch with Link, Branch with Link and Exchange

  • 현재 위치가 LR에 저장, 함수가 끝난 후 BX lr 명령어로 원래 위치로 복귀
  • BLX : ARM <-> Thumb ISA 전환 가능
  • BX, BLX 명령어는 분기할 주소(레지스터 값)의 비트0을 보고 판단
  • 0이면 ARM
  • 1이면 Thumb
  • Cortex-M4는 Thumb-2 명령어만 지원하므로
  • LR레지스터의 비트0은 항상 1
  • 메모리에 저장되는 한수 주소의 비트0도 항상1
  • 비트0이 0일 시 -> BX실행하면 오류

데이터 처리 명령어

  • Aruthmetic 산술 : ADD, ADC, SUB, SBC, RSB, RSC
  • Logical 논리 : AND, ORR, EOR, BIC
  • Comparisons 비교 : CMP, CMN, TST, TEQ
  • Data movement 데이터 이동 : MOV, MVN

해당 명령어들은, 오직 레지스터만 오퍼랜드로 사용한다. 즉 메모리 주소를 직접 접근할 수 없다.
만약 메모리 접근이 필요한 경우, 별도의 load, store 명령어를 사용해야 한다.

<Operation>{<cond>}{S} Rd, Rn, Operand2

<Operation>: 명령어 종류(ADD, SUB 등)
<cond>: 조건부 실행 코드(예: EQ, NE 등, 생략 가능)
{S}: S를 붙이면 연산 결과에 따라 플래그(CPSR)를 설정함
Rd: 결과가 저장될 레지스터
Rn: 첫 번째 입력 레지스터
Operand2: 두 번째 입력(레지스터, 즉시값, 시프트 등)

비교명령만 자동으로 플래그를 세팅하고, 나머지 명령은 접미사 S를 사용하여 플래그를 세팅할 수 있다.

레지스터 오퍼랜드 예제

기본유형

  • ADD r0, r1, r2
    ; r0 := r1 + r2
    • Unsigned integers 또는 2’s complement integers
    • R0 값만 변경되고, r1, r2 값은 바뀌지 않음 (추가로 CPSR 레지스터의 N, Z, C, V 플래그도 바뀔 수 있다)
    • 플래그 : 연산 결과를 판단하는데 사용

산술연산 (Arithmetic operations)

명령어예시설명
ADDr0, r1, r2r0 := r1 + r2
ADCr0, r1, r2r0 := r1 + r2 + C
SUBr0, r1, r2r0 := r1 - r2
SUBCr0, r1, r2r0 := r1 - r2 + C - 1
RSBr0, r1, r2r0 := r2 - r1
RSCr0, r1, r2r0 := r2 - r1 + C - 1

비트 연산명령 (Bit-wise logical operations)

명령어예시설명
ANDr0, r1, r2r0 := r1 and r2
ORRr0, r1, r2r0 := r1 or r2
EORr0, r1, r2r0 := r1 xor r2
BICr0, r1, r2r0 := r1 and not r2

레지스터 이동명령 (Register movement operations)

명령어예시설명
MOVr0, r2r0 := r2
MOVNr0, r2r0 := not r2

비교명령 (Comparison operations)

명령어예시설명
CMPr1, r2set cc on r1 - r2
CMNr1, r2set cc on r1 + r2
TSTr1, r2set cc on r1 and r2
TEQr1, r2set cc on r1 xor r2

ARM Condition Codes

B 명령에 접미어로 사용되어 조건부 분기를 실행 -> BEQ, BGT
IT블록에서는 조건부 실행 명령으로 사용될 수 있따. -> ADDLE, MOVENE

Suffix(접미어)관련된 플래그의미
EQZ setEqual
NEZ clearNot equal
CS / HSC setHigher or same (unsigned >= )
CC / LOC clearLower (unsigned < )
MIN setNegative
PLN clearPositive or zero
VSV setOverflow
VCV clearNo overflow
HIC set and Z clearHigher (unsigned > )
LSC clear or Z setLower or same (unsigned <= )
GEN and V the sameSigned >=
LTN and V differentSigned <
GTZ clear, N and V the sameSigned >
LEZ set, or N and V differentSigned <=
ALAnyAlways (usually omitted)

Program Status Registers

  • N negative : 연산 결과가 음수이면 1

  • Z zero : 연산 결과가 0이면 1

  • C carry : carry(자리올림) 이 발생하면 1

  • V overflow : signed 연산에서 overflow가 발생하면 1

  • Q status math overflowed : 포화 연산에서 오버플로어가 발생하면 1

  • ISR Number : interrupt service routine, 예외상황에서 컴퓨터가 해야할 일
    - O : Thread 모드 ( 일발 실행 상태 )

    • N : Exception 번호 ( 인터럽트 등 예외 상황 )
  • T비트
    - T = 0 : ARM 상태, Cortex-M에서 해당 상태가 되면 오류

    • T = 1 : Thumb 상태
  • IT/ICI
    - If Then 조건 코드 : Thumb-2에서 조건부 실행을 위한 블록 지정

    • Interrupt Control Information : 인터럽트 제어 정보

ARM ISA의 Conditional Execution

조건부 실행

ARM ISA에서는 대부분의 명령어에 조건을 붙여 실행할 수 있다.

CMP r0, #5
BEQ BYPASS
ADD r1, r1, r0
SUB r1, r1, r2

r0이 5와 같으면 바이패스로 점프, 아니면 순차적으로 ADD, SUB 실행

CMP r0, #5        ; r0와 5를 비교 (r0 - 5 결과로 플래그 설정)
ADDEQ r1, r1, r2  ; r0 == 5일 때만 r1 = r1 + r2 실행
SUBNE r1, r1, r3  ; r0 != 5일 때만 r1 = r1 - r3 실행

하나하나 조건문을 붙일 수도 있음.

  • 코드가 더 짧고, 빠르며, 분기 명령어가 줄어들음. 즉 파이프라인 성능이 높아김

  • Thumb-2 특징
    - If Then 블록 안에서만 조건부 명령 사용 가능

    • 일반 ARM에서는 모든 명렁어에 조건부 실행이 가능, Thumb-2만 제한적

Thumb-2의 If Then 코드블록

If-Then condition instruction

  • Condition이 참인 경우 IT블록의 THEN으로 지정된 명령어들을, 거짓이면 ELSE로 지정된 명령어를 실행
  • 최대 4개의 인스트럭션 블록에만 사용 가능

IT(If-Then) 블록 문법 정리

  • 기본 문법:
    IT{X{Y{Z}}} condition

  • X, Y, Z의 의미:

    • X: IT 블록의 두 번째 명령어의 조건 스위치
    • Y: IT 블록의 세 번째 명령어의 조건 스위치
    • Z: IT 블록의 네 번째 명령어의 조건 스위치
  • 조건 스위치:

    • T: Then (조건이 참일 때 실행)
    • E: Else (조건이 거짓일 때 실행)
  • 예시:
    ITTE NE

    • 다음 두 줄의 명령어는 Then(조건 NE일 때 실행)
    • 세 번째 줄은 Else(NE가 아닐 때 실행)
    • 즉, TTE 순서로 명령어들이 배치됨

메모리 데이터 이동명령어

레지스터 <-> 메모리 사이에서 데이터를 주고받는 명령어
한 번에 하나 또는 두개의 메모리 사이에서 이동 가능

LDRD / STRD: Doubleword(64비트) 단위로 이동
LDR / STR: Word(32비트) 단위로 이동
LDRB / STRB: Byte(8비트) 단위로 이동
LDRH / STRH: Halfword(16비트) 단위로 이동
LDRSB: 부호 확장된 바이트(8비트) 로드
LDRSH: 부호 확장된 하프워드(16비트) 로드

  • 데이터 확장 : 바이트나 하프워드 단위로 로드할 때, 상위 비트는 0으로 채우거나 부호 비트로 확장함
LDRB r0, [r1]   ; r1이 가리키는 메모리에서 1바이트를 읽어 r0의 하위 8비트에 저장

다중 레지스터 데이터 이동명령어

LDM Load Multiple

LDMIA r1,{r0,r2,r5}
Load Multiple Increment After
r1이 가리키는 메모리 주소에서 32비트 단위로 값을 읽어와 차례로 r0,r2,r5에 저장

r0 = mem32r1
r2 = mem32r1 + 4
r5 = mem32r1 + 8

r1은 자동 인덱싱에 사용

STM Store Mulitple

STMIA r1,{r0,r2,r5}
Store Mulitiple Increment After 32비트 단위로 저장

Stack Addressing

  • Ascending stack : 스택에 push 할수록 메모리 주소가 커짐.
  • Descending stack : 스택에 push 할수록 메모리 주소가 작아짐 -> ARM에서 사용
  • Full stack : Stack Pointer가 스택에 마지막으로 저장된 데이터를 가리킴. 즉 현재 데이터가 들어있는 위치를 가리킴
  • Empty stack : 스택 포인터가 아직 데이터가 들어있지 않는 빈 공간을 가리킴. SP는 다음에 데이터가 저장될 위치를 가리킴
  • ARM의 다중 레지스터 전송 명령어와 스택 구조
  • LDM/STM 명령어는 네 가지 스택 구조를 모두 지원한다.
    즉, 방향 : 위로 아래로
    SP가 가르키는 곳 : 현재, 다음

LDM, STM 명령어에서 사용하는 접미사 조합

스택의 운영 방식에 따라
Increment I : 증가하는 스택, SP 증가
Decrement D : 감소하는 스택
After A : 데이터를 푸쉬 한 후 SP를 감소or증가시킴. 즉 현재 SP가 가리키는 위치에 먼저 데이터를 저장하고 SP 이동
Before B : SP를 스택 방향에 따라 먼저 증or감 하고 그리고 데이터 저장
Full F : 스택 포인터가 현재 쌓여있는 데이터의 위치를 가르킴
Empty E : 스택 포이터가 다음에 데이터를 저장할 빈 공간을 가르킴
를 접미사에 붙여준다.

Multiple register transfer addressing modes


STMIA : Store Multiple Increment After
여러 레지스터의 값을 메모리에 한 번에 저장 -> 저장할 때마다 메모리 주소가 4씩 증가
즉, r0, r1, r5 값을 r9가 가르키는 메모리로부터(Before) 4바이트씩 차례로 저장하고, 저장이 끝나면 r9값이 0x100C로 자동 증가

A : 데이터를 저장하기 전에 SP를 먼저 증가/감소시킨다.
A는 F랑 엮어짐.


STMIB : 여러 레지스터의 값을 메모리에 저장
Increase Before: 즉 저장 전에 SP를 증가시킴

용어 정리
• A(After): 저장/로드 “후”에 포인터(SP)가 증가/감소
• B(Before): 저장/로드 “전”에 포인터가 증가/감소
• F(Full): SP가 마지막으로 저장된 데이터(채워진 위치)를 가리킴
• E(Empty): SP가 다음에 저장될 빈 공간(아직 데이터가 없는 위치)을 가리킴

Stack Examples


첫번째 그림 : STMFD sp!, {r0, r1, r3-r5}
걍 F랑 B랑 같다고 생각하믄 됨. 그럼면 STMDB. 즉 데이터를 저장하기 전에 SP를 먼저 감소시킨다.

STM Full Decrement
감소하는 스택 방향, 다 끝나고 스택 포인터는 현재 쌓여있는 데이터의 위치를 가르킴.


STMFA sp!. {r0,r1,r3-r5}
데이터를 저장해라. 이때 현재 sp는 Full이다. 그리고 마지막은 Ascending
즉 한칸 증가하고 채워넣기

FA -> Full Ascending
Full : SP가 항상 마지막에 데이터가 채워진 위치를 가르킴

== STMIB -> Increment Before
데이터가 채워져 있으므로, SP를 ++ or -- 하고 Load, Store 진행

A에는 Acsending과 After 두 가지 의미가 있다. 따라서
FA -> Full Acsending
IA -> Incresement After

두 가지 의미는 완전히 반대다. 유의하도록 하자.

LDM, STM 예제

LDMIA r0!, {r2-r9}

LDMIA LDM Incresement After
현재 r0가 가르키는 주소에서 r2-r9 값을 불러옴
각 값을 불러올 때마다 r0를 4바이트씩 증가
그리고 마지막에는 SP 증가

STMIA r1, {r2-r9}

STMIA
STM Incresment After
r1부터 r2-r9값을 저장함.
이때 r1은 초기화하지 않음, 즉 r1이 가리키는 주소는 처음과 같다. !의 유무

r2-r9까지 값을 저장하는 코드

STMFD r13!,{r2-r9}

Full Decsent . FULL : FULL ? r13이 마지막으로 저장된 데이터를 가르킴. 따라서 SP를 먼저 4만큼 감소시킨다.
그리고 데이터 저장 한 후 반복

LDMIA r0!,{r2-r9}

Increse After .
즉 현재 r0 위치에서부터 데이터를 load함. 같은 말로는 LDMED

MRS : Copy from PSR to Registers

Program status register의 값을 일반 레지스터로 복사하는 명령어이다. CPU의 현재 상태 (플래그, 모드, 인터럽트 상태) 를 소프트웨어가 직접 읽어서 사용할 수 있게 해준다.

MRS : Move Register from Status. 즉 PSR의 값을 일반 레지스터 ( r0-r15 ) 로 복사함.
MSR : Move status from Register. 일반 레지스터의 값을 PSR에 넣기

  • MRS{cond} Rd, psr
    • PSR(Program Status Register)의 값을 일반 레지스터(Rd)로 복사
    • cond: (옵션) 조건 코드
    • Rd: 값을 받을 목적지 레지스터
    • psr: 복사할 PSR 종류
      • APSR: 모든 프로세서, 모든 모드에서 사용
      • CPSR: APSR의 구식 명칭(ARMv7-M, ARMv6-M에서는 사용 불가)
      • SPSR: ARMv7-M, ARMv6-M을 제외한 프로세서에서 특권 모드에서만 사용
      • Mpsr: ARMv7-M, ARMv6-M에서만 사용
MRS R0, CPSR   ; CPSR(현재 상태 레지스터)의 값을 R0에 복사
  • Mpsr는 다음 중 하나일 수 있음:

    • IPSR, EPSR, IEPSR, IAPSR, EAPSR, MSP, PSP, XPSR, PRIMASK, BASEPRI, BASEPRI_MAX, FAULTMASK, CONTROL
  • 참고

    • xPSR과 같은 특수 레지스터는 특권 모드에서만 접근 가능

MSR : Copy value to PSR

  • MSR{cond} APSR_flags, Rm
    • 일반 레지스터(Rm)의 값을 PSR(특히 APSR)의 특정 플래그에 복사
    • cond: (옵션) 조건 코드
    • APSR_flags: 옮길 플래그 지정
      • n z c v q: ALU 플래그 마스크 (PSR[31:27], User mode)
      • g: SIMD GE 플래그 마스크 (PSR[19:16], User mode)
    • Rm: 소스 레지스터 (PC는 사용 불가)

  • MRS: PSR → 일반 레지스터로 값 복사
  • MSR: 일반 레지스터 → PSR(플래그)에 값 복사

Quiz


ITTEE EQ
IT THEN THEN ELSE ELS어
조건은 EQ. 즉 Z플래그가 1.
Z=1 이면 1,2번째 명령어 EQ
Z=0 이면 3,4번째 명령어 NE

suffix 명령어 실행 결과를 CPU의 플래그 레지스터에 기록하게 하줌.
S=1 ? AND 명령어에서 비트0이 1이면 True, AND연산이 1이 되는 상황을 의미

ANDNE R3, R3, #1 실행

  1. Cortex-M4 명령어는 Thumb-2 명령어 집합만 지원.ㅇㅇ
  2. Fetch, Decode, Execute.ㅇㅇ
  3. Directive는 CPU가 실행하는 명령어 즉 Thumb-2 명령어가 아니라 어셈블리 소스 처리과정에서만 사용된다. Directive는 Thumb-2 명령어가 아니며, CPU가 실행하는 명령이 아님. XX
  4. 맞는 설명이다. 리턴 주소를 LR에 저장. BX LR로 복귀. ㅇㅇ
  5. 단순 명령어들은 CPI 즉 1사이클에 다 실행됨. 일반적인 경우에는 1사이클

0개의 댓글