

즉, 파이프라인에서 fetch, decode, execute에서 execute에 branch가 있으면 fetch와 decode에 적힌 명령어가 실행되더라도 branch(분기)해야 하기때문에 쓸모가 없음. 즉 분기 이후 새로운 명령어 1, 2를 받아야 함. Conditional Execution and Flag를 사용하면 이러한 짧은 앞쪽 분기를 제거 가능.
s 접미사를 사용하여 어떤 명령어가 조건을 설정하는지 제어 가능: 명령어가 실행된 결과가 음수일 경우 즉, 최상위 비트가 1일 경우 N비트는 1
: 명령어가 실행된 결과가 0인지를 나타냄.
: 즉, 명령어가 실행된 후 결과 값이 0일 경우 Z bit는 1
: 명령어에서 발생한 Carry또는 Carry-out(빌로)를 나타냄. 주로 덧셈 또는 뺄셈에서 발생한 캐리를 검사하는데 사용
: 명령어가 실행된 결과에 Overflow가 발생했는지를 나타냄. 즉, 부호있는 연산에서 발생한 결과의 오버플로우를 검사하는데 사용
이러한 비트들은 조건부 분기 명령어(ex. BNE, BEQ)등에서 사용. 이들을 통해 프로그램의 제어 흐름 결정 가능.
e.g) BEQ 명령어는 Z bit가 1일 때 실행. BNE 명령어는 Z 비트가 0일 때 실행
BEQ 명령어는 Z(Zero) 비트가 1일 때 실행됩니다.
Z 비트는 이전 명령어의 실행 결과가 0인지를 나타냅니다. 즉, 이전 명령어의 실행 결과가 0이면 Z 비트가 1이 됩니다.
BEQ 명령어는 Z 비트가 1일 때, 즉, 이전 명령어의 실행 결과가 0인 경우에 실행됩니다.
이는 주로 두 값이 동일한 경우 분기해야 할 때 사용됩니다. 즉, 두 값이 같으면 분기하고, 다르면 분기하지 않습니다.
BNE 명령어는 Z(Zero) 비트가 0일 때 실행됩니다.
Z 비트는 이전 명령어의 실행 결과가 0인지를 나타냅니다. 즉, 이전 명령어의 실행 결과가 0이 아니면 Z 비트가 0이 됩니다.
BNE 명령어는 Z 비트가 0일 때, 즉, 이전 명령어의 실행 결과가 0이 아닌 경우에 실행됩니다.
이는 주로 두 값이 다른 경우 분기해야 할 때 사용됩니다. 즉, 두 값이 다르면 분기하고, 같으면 분기하지 않습니다.
cf. 양수 + 양수를 했는데 음수가 나옴.
즉, (overflow) 될 경우v bit를 통해 알 수 있음.
ARM 명령어는 적절한 조건 코드를 접미사로 추가함으로써 조건적으로 실행 가능
: 이는 코드 밀도를 높이고, 앞쪽 분기의 수를 줄임으로써 성능 향상 가능
: 밑의 코드에서는 branch가 나오지 않기 때문에 분기가 발생하지 않아 파이프라인이 깨지지 않음
GT : Greater Than 큼
LE: Least Equal 작거나 같음

ADDS 명령어는 덧셈을 수행하고, 그 결과에 따라 조건 플래그를 업데이트
ADDS R1, R2, #10
: 레지스터 R2의 값에 10을 더하고, 그 결과를 레지스터 R1에 저장
ADDS R1, R2, #10
: 덧셈을 수행하고, 그 결과를 레지스터 R1에 저장. 동시에 덧셈 결과에 따라 조건 플래그를 업데이트
/
즉, S는 명령어가 실행된 후에 조건 코드를 나타내는 상태 비트들을 업데이트
SUB'S' 를 함으로써 SET FLAGS도 진행

SUB R1 R1 #0X01#0x01: 16진수 값인 0x01을 나타내며, 이 값이 레지스터 R1에서 뺄셈됩니다.BNE loopBranch if Not Equal의 약어1. Z 플래그가 0인 경우
=이전 결과값이 0이 아닌 경우
= BNE 명령어 실행
= 즉, LOOP 실행2. Z플래그가 0이 아닌 경우
= 이전 결과값이 0인 경우
= BNE 명령어 건너 뛰고 다음 명령어 실행




ADD
: 첫 번째 및 두 번째 피연산자를 더하고 결과를 목적지 레지스터에 저장합니다.
ADC
: 덧셈에 대한 캐리 플래그를 포함하여 두 피연산자를 더합니다.
SUB
: 첫 번째 피연산자에서 두 번째 피연산자를 뺀 결과를 목적지 레지스터에 저장합니다.
SBC
: 뺄셈에 대한 캐리 플래그를 포함하여 두 피연산자를 빼고, 결과를 목적지 레지스터에 저장합니다.
RSB
: 두 번째 피연산자에서 첫 번째 피연산자를 뺀 결과를 목적지 레지스터에 저장합니다.
RSC
: 두 번째 피연산자에서 첫 번째 피연산자와 캐리 플래그를 빼고 결과를 목적지 레지스터에 저장합니다.
AND
: 두 피연산자의 비트 단위 AND 연산을 수행하고 결과를 목적지 레지스터에 저장합니다.
ORR
: 두 피연산자의 비트 단위 OR 연산을 수행하고 결과를 목적지 레지스터에 저장합니다.
EOR
: 두 피연산자의 비트 단위 XOR (배타적 OR) 연산을 수행하고 결과를 목적지 레지스터에 저장합니다.
BIC
: 첫 번째 피연산자에서 두 번째 피연산자의 비트를 클리어하고 결과를 목적지 레지스터에 저장합니다.
CMP
: 두 피연산자를 비교하여 결과에 대한 플래그를 설정하지만 실제로 결과를 목적지에 저장하지 않습니다.
CMN
: 두 피연산자의 부호 없는 덧셈을 수행하고 결과에 대한 플래그를 설정하지만 결과를 목적지에 저장하지 않습니다.
TST
: 두 피연산자의 비트 단위 AND 연산을 수행하여 결과에 대한 플래그를 설정하지만 결과를 목적지에 저장하지 않습니다.
TEQ
: 두 피연산자의 비트 단위 XOR 연산을 수행하여 결과에 대한 플래그를 설정하지만 결과를 목적지에 저장하지 않습니다.
MOV
: 소스 피연산자의 값을 목적지 레지스터로 이동합니다.
MVN
: 소스 피연산자의 비트를 반전하여 결과를 목적지 레지스터에 저장합니다.
SUB R0 R1 R2의 경우: R1 - R2
RSB R0 R1 R2의 경우: R2 - R1
EX.
A = B - 10
A = 10 - B 일 때
Operand2는 레지스터 또는 value값이 가능
그러나 R1의 경우 레지스터만 가능
그러므로 OP Rd Rn Op2의 형태를 유지하기 위해선 RSB도 필요함!
RSC: Reverse Subtract Carry
이러한 명령어는 레지스터에만 작도앟며 메모리에는 적용되지 않음
syntax
Operand 2는 레지스터 또는 즉시 값
: SUB r0, r1, r2
: AND r1, r4, #0xFF
비교는 플래그만 설정 가능 Rd를 지정하지 않음
: CMP R0 R3
데이터 이동은 Rn을 지정하지 않음
: MOV R0 R1(R1 레지스터의 값을 R0으로 복사)
OP2는 barrel shifter를 통해 ALU로 전송

: 프로세서 내부의 회로
: 주로 ALU(산술 논리 연산 장치)와 함께 사용.
: ALU로 전달되는 두 번째 피연산자(Op2)를 반환하고 수정함.

5비트의 부호 없는 정수
다른 레지스터의 하위 바이트에 지정된 값
즉, 시프트 연산에 사용되는 값은 5비트의 부호 없는 정수일 수도 있고, 다른 레지스터의 하위 바이트에서 가져올 수도 있음.
앞의 shift operation(시프트 연산)은 상수를 곱셈하는 데 사용
ex.
ADD r0, r5, r5 LSL1 → r0 = r5 x 3
: 시프트 연산을 사용하여 곱셈을 수행하는 방법
: r5를 1비트 왼쪽으로 shift하여 값을 2배로 만들고, 그 결과를 r0에 더함. 결과적으로, r0은 r5의 값에 3을 곱한 값.
shift 연산은 데이터 처리 명령어의 일부로 사용
비트는 일반적으로 성능 페널티 없이 0에서 31까지 위치 이동 가능.
LSL(Logical Left Shift)
: Multiplication by a power of 2
: 2를 곱하기
ASR(Arithmetic Right Shift)
: Division by power of 2
: preserving the sign bit
: 2로 나누기 + 부호 비트 보존o
(부호 비트: +인 경우 0, -인 경우 1)
LSR(Logical Shift Right)
: 2로 나누기, 부호 비트 보존x
ROR(Rotate Right)
: 비트를 오른쪽으로 회전.
: wrap around 가장 왼쪽 비트(MSB, Most Significant Bit)를 가장 오른쪽 비트(LSB, Least Significant Bit)로 이동
예를 들어, 8비트 이진수 10101100을 왼쪽으로 1비트 회전시키면, 비트는 01011001
1이 LSB에서 MSB로 회전하여 MSB로 이동하고, 나머지 비트는 한 자리씩 왼쪽으로 이동하며, 가장 오른쪽 비트는 가장 왼쪽 비트로 감싸짐
ROR R0, R1, #2
이 명령어는 R1 레지스터의 값을 오른쪽으로 2비트 회전하고, 그 결과를 R0 레지스터에 저장합니다. 즉, R1의 값을 오른쪽으로 2비트 회전시킨 후 그 값을 R0에 저장합니다.
R0: 00101011 (회전된 값)
예를 들어, 초기에 R1 레지스터에 10101100이 저장되어 있다고 가정해 봅시다. 이 때 ROR 명령어를 실행하면 LSB가 MSB로 이동하면서 회전됩니다. 따라서 회전 후의 결과는 다음과 같이 될 것입니다:
R0: 00101011 (회전된 값)
RRX(Rotate Right Extended)예를 들어, 8비트 이진수 10101100을 CF에서 MSB까지 한 번 회전시키면, 비트는 01010110. 즉, 가장 오른쪽 비트인 LSB를 MSB로 이동함.

3단 파이프라인의 경우 fetch하는데 한 사이클, decode하는데 한 사이클, execute하는데 한 사이클
LSL(logical shift left, 왼쪽으로 1만큼 shift)
: 즉, x2의 의미를 가짐.
: ex. 3만큼 움직이면 2^3해서 8만큼
ADD R0 R5 R5 LSL 1
의 경우 R5를 1만큼 왼쪽 이동해서 R52 한 후에 ADD R5 해서 2R5 + R5 = 3R5 즉, 결과 레지스터(r0)에는 r53

0xe3a004ff
e3a0: MOV 명령어
04ff: operand 값
- r0 레지스터에 즉시 값 0xff를 이동하는 MOV 명령어
"MOV r0, #0xff"
: r0 레지스터에 255라는 값을 할당하는 명령어- ff가 immed
- 오른쪽으로 8bit 로테이트
cf. "MOV r0, #10"는 r0 레지스터에 상수 값 10을 이동하는 명령어
cf. 8비트 이진수 11001100을 오른쪽으로 8비트 로테이트하면, 비트는 다음과 같이 회전됩니다
: 00110011

0xFF라는 상수 값을 r0 레지스터에 로드함
mov가 불가능한 경우 LDR을 사용하여 레지스터에서 직접 읽어옴.
LDR r0, [PC, #Imm12]
"[PC, #Imm12]": 로드할 데이터가 저장된 메모리의 주소를 계산하기 위한 표현식
: PC 레지스터 값을 기준으로 한 상대적인 주소를 지정합니다. 여기서 "#Imm12"는 12비트 즉시 상수 값을 나타내며, 이 값은 0부터 4095(0xfff)까지의 값을 가질 수 있습니다.
DCD 0x55555555
: "DCD"는 "Define Constant Doubleword"의 약어
: 메모리에 32비트 데이터로서 모든 비트가 1로 설정된 값을 정의
곱셈에는 2가지 종류가 존재
: 32bit 결과를 생성
: 64bit 결과를 생성
32bit 버전은 ARM7TDMI와 같은 이전 버전에서 2~5 사이클 내에 실행
ex.
1. MUL R0, R1, R2 => R0 = R1 * R2
2. MLA R0, R1, R2, R3 : R0 => (R1*R2)+R3
- MLA(곱셈을 수행하고 그 결과에 누적값을 더하기)
ex.
1. [U|S]MULL R4, R5, R2, R3 => R5:R4 = R2*R3
: "r2 * r3"의 결과를 64비트 값으로 계산하고, 그 결과를 r4와 r5 레지스터에 저장
2. [U|S]MLAL R4, R5, R2, R3 => R5:R4 = (R2*R3) + R5:R4
: "r2 * r3"의 결과를 64비트 값으로 계산하고, 이 결과에 r5:r4 레지스터에 저장된 값을 더함.
- MULL(Multiply Long)
: 32비트 레지스터 2개를 곱하고 그 결과를 64bit 레지스터 하나에 저장. 부호가 있거나 혹은 없는 32bit 곱셈을 수행할 때 사용.- [U|S] 의 U는 Unsigned, S는 Signed
- MLAL(Multiply Accumulate Long)
: 곱셉과 덧셈을 결합하여 수행
: 두 개의 32bit 레지스터 값을 곱한 후, 그 겨로가에 다른 64bit 레지스터에 저장된 값을 더함.
MULL은 MUL에다가 L을 붙인거, L을 붙였다는 뜻은 64bit라는 의미임. 즉, 64비트 곱하기
: 즉, r5:r4 = r2*r3임
ARM 코어 대부분이 정수 나눗셈 명령어를 제공하지 않음.
: 정수 나눗셈 연산은 대부분 C라이브러리 루틴이나 인라인 쉬프트를 사용하여 수행

start 라벨로의 PC 상대 분기를 수행. B{L}{<condition>} label
: B 분기
: label 분기 목표 지점을 나타내는 주소
: cond branch condition, 즉 조건을 검. 특정 조건을 만족할 때만 분기 수행
: {L} 서브루틴 호출을 나타내는 옵션. 명령어를 수행한 후에 돌아올 주소를 저장하는 레지스터에 현재 명령어의 다음 주소를 저장
명령어 인코딩에는 24bit 주소 오프셋 필드 포함. 실행 시 이 오프셋은 2비트 왼쪽으로 이동되어야 함.(ARM 명령어는 항상 워드 정렬되어 있기 때문에) 이로써 상대적인 분기 범위가 32MB
분기 명령어의 실행은 파이프라인 플러시(Pipeline flush)를 발생. 파이프라인 플러시는 프로세서 파이프라인을 지우고 새로운 명령어를 가져오는 작업 수행
절대 분기(Absolute branches)는 PC를 직접 수정하여 구현 가능.
LDR pcMOV pc, ...SUBS pc, ...절대 분기(Absolute Branch)
- 절대 분기는 목적지 주소를 직접 명시하여 분기하는 방식입니다.
- 주로 점프 명령어(LDR pc, MOV pc, SUBS pc 등)를 사용하여 구현됩니다.
- 목적지 주소는 절대적이며, 전체 주소 공간 내의 특정 위치를 가리킵니다.
- 예를 들어, 주소 0x1000에 있는 코드로 분기할 수 있습니다.
- ex.
MOV pc, r1: r1에 저장된 값이 PC로 이동하여 분기 수행- ex.
LDR pc, [r2]: r2가 가리키는 주소에 있는 데이터를 로드 후 해당 데이터를 프로그램 카운터로 설정하여 분기 수행- ex.
SUBS pc, r3, #4: r3에 저장된 값에서 4를 뺀 결과를 PC 값으로 설정
상대 분기(PC Relative Branch)
- 상대 분기는 현재 명령어의 위치를 기준으로 한 상대적인 오프셋을 사용하여 분기합니다.
- PC 상대적 분기 명령어를 사용하여 구현됩니다.
- 목적지 주소는 현재 PC 값과 상대적으로 계산되며, 일반적으로 몇 바이트만큼 떨어진 곳으로 분기합니다.
- 예를 들어, 현재 위치에서 10바이트 떨어진 곳으로 분기할 수 있습니다.
position independent vs position dependent
- 절대주소값이 딱 정해지는 것이 position dependent
- pc의 index count값으로 정해주는 것이 position independent
ex. 8 = 1000, 4 = 100
Branch and Exchange 명령어(BX)는 실행 중인 코드의 상태를 전환하고 다른 상태에서의 분기를 수행
BX Rn: Thumb 상태 분기 교환BX <condition> Rn: ARM 상태 분기 교환
ARM/Thumb Selection은 0일 때 ARM 상태, 1일 때 Thumb 상태.
분기 교환 명령어(BX)는 상태 변경 없이도 절대 분기로 사용 가능.
BL(Branch with Link)
BL subroutine_address
1. 현재의 프로그램 카운터(PC)의 다음 주소가 링크 레지스터(LR)에 저장됩니다. 이는 서브루틴이 실행을 마치고 반환할 주소를 저장하는 데 사용됩니다.
2. 명령어는 "subroutine_address"로 분기합니다. 따라서 프로그램은 지정된 서브루틴으로 분기하게 됩니다.

즉, 분기 명령어를 사용하여 특정 주소로 분기하는 것이 아니라, 직접 PC레지스터에 주소 값을 로드하여 분기 가능. 이렇게 하면 분기의 범위가 제한되지 않음.

: 데이터를 담아두는 공간
: 즉 명령어 공간 안에 데이터를 집어넣음, 그러므로 fetch 되지 않을 위치에다가 담아두어야 함.
상수나 리터럴 값이 반복해서 사용되는 경우, 이러한 값들은 메모리의 특정 영역에 저장. 이렇게 상수나 리터럴 값이 저장된 메모리 영역을 "Literal Pool"

MRS{<cond>} Rd, <psr>: = <psr>
: Rd 레지스터에 <psr>의 내용을 전송
MSR{<cond>} <psr[_fileds]>, Rm: <psr[_fields]> =
: Rm 레지스터의 내용을 <psr[_fileds]>에 전송
: 여기서 <psr[_fields]>는 CPSR 또는 SPSR이며, 필드 중 하나인 'fsxc' 중 선택적으로 조합
MSR{<cond>} <psr_fields>,#Immediate
: 직접적인 형태로 <psr_fields>에 즉시 값을 전송
: <psr>은 CPSR또는 SPSR을 나타냄
: <psr[_fields]>는 CPSR 또는 SPSR에 있는 특정 필드 가리키기.
psr(program status register)이란?
: ARM 아키텍처에서 사용되는 특수 레지스터
: 현재 프로그램의 상태와 관련된 정보 저장.
CF. 사용자 모드에서는 모든 버튼을 읽을 수 있지만, 조건 플래그만 새울 수 있음.

이 설명은 CPSR(Current Program Status Register)를 수정하여 IRQ(Interrupt Request) 인터럽트를 활성화하는 예시를 제시하고 있습니다.
일반적으로는 읽기/수정/쓰기 전략이 사용됩니다:
아래 예시는 CPSR을 수정하여 IRQ 인터럽트를 활성화하는 방법을 보여줍니다:
코드는 조심스럽게 'c' 바이트만 쓰기 때문에 다른 비트가 의도치 않게 변경되지 않도록 주의합니다:
CPSR을 상수 값으로 설정하는 것은 가능하지만 주의해서 사용해야 합니다:

LDR{<cond>}{<size>} Rd, <address>STR{<cond>}{<size>}Rd, <address>CF. LDR(Load Register), STR(Store Register)
CF. LDREQB
: LDR + EQUAL + BYTE
: 조건이 EQUAL 인 경우 BYTE 크기의 데이터를 로드

CF. OFFSET
: 어떤 위치나 값을 참조하기 위해 기준점으로부터의 상대적인 거리나 위치를 나타냄.
LDR r0, [r1, #8]LDR r0, [r1, r2]LDR r0, [r1, r2, LSL#2]LDR r0, [r1, #-8]LDR r0, [r1, -r2, LSL#2]LDR r0, [r1, #-8]!
LDR r0, [r1, #8]
: r1이 가리키는 메모리 주소에서 8바이트(offset)만큼 이동한 위치의 데이터를 로드하여 r0 레지스터에 저장합니다.LDR r0, [r1, r2]
: r1이 가리키는 메모리 주소에서 r2 레지스터가 가리키는 오프셋(offset)만큼 이동한 위치의 데이터를 로드하여 r0 레지스터에 저장.LDR r0, [r1, r2, LSL#2]
: r1이 가리키는 메모리 주소에서 r2 레지스터가 가리키는 오프셋(offset)에 4를 곱한 값만큼 이동한 위치의 데이터를 로드하여 r0 레지스터에 저장. 이 때, LSL#2는 r2의 값을 왼쪽으로 2비트 시프트하는 것을 의미LDR r0, [r1, #-8]
: r1이 가리키는 메모리 주소에서 8바이트(offset)만큼 반대 방향으로 이동한 위치의 데이터를 로드하여 r0 레지스터에 저장LDR r0, [r1, -r2, LSL#2]
: r1이 가리키는 메모리 주소에서 r2 레지스터가 가리키는 값을 왼쪽으로 2비트 시프트한 값을 반대 방향으로 이동한 위치의 데이터를 로드하여 r0 레지스터에 저장LDR r0, [r1, #-8]!
: r1이 가리키는 메모리 주소에서 8바이트(offset)만큼 반대 방향으로 이동한 위치의 데이터를 로드하여 r0 레지스터에 저장하고, r1에 -8을 더한 새로운 주소를 저장
메모리 주소에 상대적인 OFFSET을 적용하여 데이터에 접근하는 방법.
[r1, #8]!와 같이 사용될 수 있으며, 이 경우 r1이 가리키는 주소에 8바이트를 더한 주소로 데이터를 접근하고, 그 후 r1이 8만큼 증가[r1], #8와 같이 사용될 수 있으며, 이 경우 r1이 가리키는 주소로 데이터에 접근한 후에 r1이 8만큼 증가.


loop LDR r0, [r8], #4 // load 4 bytes
STR r0, [r10], #4 // and store them
CMP r8, r9 // check for the end
BLT loop // else loop
STR 명령어에서 r10 레지스터의 값을 4만큼 증가시키는 이유는 메모리에서 데이터를 읽고 저장하는 동안 다음 데이터를 저장할 위치를 나타내기 위해서
r8이 r9보다 작으면 아직 복사할 데이터가 남아 있음을 의미하므로 루프를 계속하여 더 많은 데이터를 복사
이 예제에서는 각 반복마다 1 워드가 복사
<LDM|STM>{<cond>}<addressing_mode> Rb{!}, <register list>
LDMIA(Load Multiple Increment After) / STMIA(Store Multiple Increment After)
: increment after
LDMIB / STMIB
: increment before
LDMDA / STMDA
: decrement after
LDMDB / STMDB
: decrement before

after와 before 차이 기억하기
increament와 decrease 차이 기억하기
LDMIA R10, {R0, R1, R4}
: R10이 가리키는 메모리 위치에서 R0, R1, R4 레지스터로 데이터를 로드합니다.
이후에 R10 레지스터 값을 증가시킵니다. (Increment After)
LDMIB R10, {R0, R1, R4}
: R10이 가리키는 메모리 위치에서 R0, R1, R4 레지스터로 데이터를 로드합니다.
로드 작업 이전에 R10 레지스터 값을 증가시킵니다. (Increment Before)
LDMDA R10, {R0, R1, R4}
: R10이 가리키는 메모리 위치에서 R0, R1, R4 레지스터로 데이터를 로드합니다.
이후에 R10 레지스터 값을 감소시킵니다. (Decrement After)
LDMDB R10, {R0, R1, R4}
: R10이 가리키는 메모리 위치에서 R0, R1, R4 레지스터로 데이터를 로드합니다.
로드 작업 이전에 R10 레지스터 값을 감소시킵니다. (Decrement Before)
증가(increment) 방식:
증가 방식에서는 데이터를 읽거나 저장한 후에 레지스터 값을 증가시킵니다.
이렇게 하면 다음 데이터가 저장될 위치를 지정하기가 편리합니다.
메모리의 연속적인 데이터를 로드하거나 저장하는 데 특히 유용합니다.감소(decrement) 방식:
감소 방식에서는 데이터를 읽거나 저장하기 전에 레지스터 값을 감소시킵니다.
이렇게 하면 이전 데이터의 위치를 지정할 수 있습니다.
주로 스택과 같이 메모리의 역순으로 데이터를 처리할 때 유용합니다.
loop LDMIA r8!, {r0-r8}
STMIA r10!, {r0-47}
CMP r8, r9
BLT loop

LDMIA r8!, {r0-r8}:
r8이 가리키는 메모리 위치에서 데이터를 읽어와 r0부터 r8까지의 레지스터에 저장합니다.
읽기 작업 이후에 r8 레지스터 값을 증가시킵니다.STMIA r10!, {r0-47}:
r0부터 r7까지의 레지스터에 있는 데이터를 r10이 가리키는 메모리 위치에 저장합니다.
쓰기 작업 이후에 r10 레지스터 값을 증가시킵니다.CMP r8, r9:
r8과 r9 레지스터의 값을 비교합니다. 이 명령어는 루프 종료 조건을 검사하기 위해 사용됩니다.
BLT loop:
r8이 r9보다 작으면 루프로 이동하여 작업을 계속합니다. 이렇게 함으로써, r8이 r9보다 작은 동안 루프를 반복하여 메모리 블록을 계속 복사합니다.

Store Multiple - Full Descending stack [STMDB]
: 스택에 여러 레지스터를 저장하는데 사용되며, Full Descending stack 방식
이는 STMDB(Store Multiple Decrement Before)와 동등한 동작을 함.
Load Multiple - Full Descending stack [LDMIA]
: 스택에서 여러 레지스터를 로드하는데 사용되며, Full Descending stack 방식. 이는 LDMIA(Load Multiple Increment After)와 동등한 동작을 함. 이 명령어는 스택에서 레지스터를 로드하기 위해 사용

SWP{<cond>}{B} Rd, Rm, [Rn]

SWP: Swap을 의미합니다.
<cond\>: 조건 코드(Conditional Code)가 선택적으로 사용됩니다.
{B}: 바이트(Byte) 크기로의 이동을 나타냅니다. 이 부분은 선택적입니다.
Rd: 이동할 데이터를 담을 레지스터입니다.
Rm: 이동할 데이터를 담고 있는 레지스터입니다.
[Rn]: 데이터를 읽거나 쓸 메모리 위치를 가리키는 베이스 레지스터입니다.



SWI: Software Interrupt를 의미합니다.<cond>: 조건 코드(Conditional Code)가 선택적으로 사용됩니다.<SWI number>: SWI 번호로, 핸들러가 어떤 작업을 수행해야 하는지를 식별: 시스템에 해당 코프로세서가 없는 경우 해당 명령어가 발생합니다.
: 사용자 모드에서 특권 명령을 수행하려고 시도할 때 해당 명령어가 발생합니다.
: ARM 아키텍처에서 정의되지 않은 명령어 또는 해당하는 명령어가 없는 비어 있는 비트 패턴이 포함된 명령어가 발생합니다.
: 이 공간은 opcode의 일부 비트 패턴으로서 명령어가 정의되어 있지 않은 영역
: 이 공간은 새로운 명령어를 추가하기 위해 예약되어 있을 수 있음.
: 예를 들어, opcode의 27~25번째 비트가 0b011이고, 4번째 비트가 1인 경우를 예로 들 수 있음.
: 이 공간에서는 opcode의 일부 비트 패턴이 정의되어 있지 않으므로, 해당 명령어들은 ARM 아키텍처에서 정의되어 있지 않은 것으로 간주