
ARM 아키텍처 버전 6에서는 이전에 비해 다양한 새로운 명령어들과 명령어 클래스들이 도입되었으며, 대부분의 명령어들이 조건부로 사용됩
; r0 = 0x12345678 가정.
UXTAH r1, r0
; r0의 하위 반워드(0x5678)를 추출하여 부호 없는 정수로 간주하고, r1에 더함.
; 실행 후 r1 레지스터에 저장되는 값
; r1 = 0x00005678
: 32비트 레지스터에 바이트를 추출하여 더하는데 사용
; r0 = 0x12345678 가정.
UXTAB r1, r0
; r0의 하위 바이트(0x78)를 추출하여 부호 없는 정수로 간주하고, r1에 더함.
; 실행 후 r1 레지스터에 저장되는 값
; r1 = 0x00000078
: 두 개의 바이트를 추출하여 각각 32비트 레지스터의 상위 및 하위 반워드에 병렬로 추가하는데 사용
r0 = 0001 0010 0011 0100 0101 0110 0111 1000
하위 16비트 = 0101 0110 0111 1000
추출된 16비트를 각각의 반워드에 병렬로 추가
r1 레지스터의 상위 반워드에는 상위 16비트가 추가되고, 하위 반워드에는 하위 16비트가 추가

UXTH r2, r1, ROR #16 와 USTH r3, r1을 통해 r2와 r3에 각각 저장PKHBT r1, r3, r2, LSL #16을 통해 r2와 r3를 합침.시나리오
1. 패킹된 데이터
r0 레지스터에 4개의 8bit 데이터 0x12, 0x34, 0x56, 0x78이 패킹되어 있음.
r0 = 0x123456782. 데이터 추출
UXTB r1, r0, #8
: r0의 두 번째 바이트를 r1에 추출
: r1에 0x34를 저장3. 데이터 패킹
두 개의 16bit 데이터를 하나의 32bit 단어로 패킹
PKHBT r0, r1, r2
: r1의 하위 16비트와 r2의 상위 16비트를 결합하여 r0에 저장
:r1 = 0x1234와r2 = 0x5678인 경우,r0=0x12345678



Greater than or Equal의 약자MSR/MRS
1. MSR (Move to Status Register)
- 일반 레지스터의 값을 상태 레지스터(CPSR 또는 SPSR)로 이동시키는 명령어
MSR CPSR, r0
; r0 레지스터의 값을 CPSR로 이동2. MRS (Move from Status Register)
- 상태 레지스터(CPSR 또는 SPSR)의 값을 일반 레지스터로 이동시키는 명령어
MRS r0, CPSR
; CPSR의 값을 r0 레지스터로 이동`

예시 시나리오
UADD8 r0, r1, r2; 초기 값 ; r1 = 0x11223344 ; r2 = 0x55667788 UADD8 r0, r1, r2
- 위 명령어 실행 후, 각 8비트 덧셈의 결과
- 첫 번째 바이트 덧셈: 0x44 + 0x88 = 0xCC(오버플로우 없음)
- 두 번째 바이트 덧셈: 0x33 + 0x77 = 0xAA(오버플로우 없음)
- 세 번째 바이트 덧셈: 0x22 + 0x66 = 0x88(오버플로우 없음)
- 네 번째 바이트 덧셈: 0x11 + 0x55 = 0x66(오버플로우 없음)
- 덧셈의 결과는 하나의 32비트 레지스터에 패킹
r0 = 0x6688AACC- 오버플로우가 모두 발생하지 않았으므로, GE비트는 모두 0으로 설정
GE[3:0] = 0000
예시 시나리오(오버플로우 발생)
첫 번째 바이트 덧셈: 0xFF + 0x01 = 0x00 (오버플로우 발생)
두 번째 바이트 덧셈: 0xFF + 0x01 = 0x00 (오버플로우 발생)
세 번째 바이트 덧셈: 0xFF + 0x01 = 0x00 (오버플로우 발생)
네 번째 바이트 덧셈: 0xFF + 0x01 = 0x00 (오버플로우 발생)
이 경우, 각 덧셈에서 오버플로우가 발생했으므로, GE 비트는 모두 1로 설정
GE[3:0] = 1111
QADD16 또는 UHADD8ADD8/SUB8 명령어는 각각의 GE 비트를 개별적으로 설정ADD16/SUB16 명령어는 GE 비트 [3:2]를 한 쌍으로, [1:0]를 한 쌍으로 설정Rm의 반워드(halfword)를 반전(reverse)하고, 병렬로 쌍(pair)을 형성하여 추가 또는 뺄셈을 수행
예시 시나리오
; ASX 명령어 예시 ; 초기 값 설정 ; r0 = 0x12345678 ; r1 = 0x87654321 ASX r2, r0, r1 ; r0와 r1의 반워드를 반전하고 덧셈을 병렬로 수행하여 결과를 r2에 저장
r0의 반워드
상위 반워드:0x1234
하위 반워드:0x5678r1의 반워드
상위 반워드:0x8765
하위 반워드:0x4321각 반워드의 비트 순서를 반전시킨 후 덧셈을 수행
- 상위 반워드의 덧셈
:0x4321 + 0x5678 = 0x9999- 하위 반워드의 덧셈
:0x8765 + 0x1234 = 0x9999
결론적으로
r2 레지스터: 0x99999999
SEL Rd, Rn, Rm

USUB8 Rd, Ra, Rb Unsigned Subtract 8-bit
: Ra 및 Rb 간의 바이트 차이에 기반하여 GE 플래그를 설정
: 각 바이트의 차이가 양수일 때 해당 GE 비트가 설정되며, 차이가 0이거나 음수이면 해당 비트가 설정되지 않음.
SEL Rd, Rb, Ra: Ra 및 Rb의 해당 바이트 중 (부호 없는) 최솟값을 Rd의 해당 바이트에 설정
: 즉, 각 바이트의 값을 비교하여 Ra 및 Rb 중 더 작은 값을 Rd에 저장
: 이때 GE 플래그를 사용하여 각 바이트가 선택
: GE 플래그가 설정된 경우에만 해당 바이트가 선택
: 즉, GE[x]=1은 첫 번째 값이 두 번째 값보다 크거나 같음을 의미하므로, Rn을 Rd에 넣고.
: GE[x]=0은 두 번째 값이 첫 번째 값보다 크거나 같음을 의미하므로, Rm을 Rd에 넣음.



PRE ARMv6
EOR r1, r0, r0, ROR #16
BIC r1, r1, #0xFF0000
MOV r0, r0, ROR #8
EOR r0, r0, r1, LSR #8
REV r0, r0
NOP32 #hint
Hint = 0: 진정한 No Operation 수행
Hint = 1: 해당 프로세서가 아무런 중요한 작업을 수행하지 않고 있는 것
CPS{IE|ID} <aif> {#mode}
<aif>는 활성화/비활성화할 인터럽트(IRQ, FIQ, Imprecise abort)를 지정; CPS 명령어를 사용하여 IRQ 인터럽트를 활성화하고
; 모드를 SYS 모드로 변경하는 경우
CPSIE if ; IRQ 인터럽트를 활성화하고
CPS #0x1F ; 모드를 SYS 모드로 변경합니다.
SETEND: 시스템 엔디안 설정SETEND {BE | LE}E비트 설정바이트 불변 Big Endian 설정
LDR r0, [r7], #4 ; Big endian SETEND LE LDR r1, [r7], #4 ; Little endian SETEND BE
- SETEND LE는 작은 엔디안으로 설정
- SETEND BE는 다시 큰 엔디안으로 설정
- 즉, 레지스터 r7이 가리키는 메모리 주소에서 4바이트를 읽어서 r0 레지스터에 저장. 이때, 데이터는 big endian으로 해석. 그리고 SETEND LE 명령어를 사용하여 시스템의 엔디안을 리틀 엔디안으로 변경함.
- 즉,
LDR r0, [r7], #4에서는 시스템이 빅 엔디안이어서 빅 엔디안으로 읽었다가 이제SETEND LE를 통해 시스템을 리틀 엔디안으로, 그 후에 읽히는LDR r1, [r7], #4를 리틀 엔디안으로 읽고 그 후SETEND BE를 이용해 시스템을 빅엔디안으로 바꿈.
LDREX Rd, [Rn]
: Rd = *Rn
STREX Rd, Rm, [Rn]
: *Rn = Rm
: 메모리가 업데이트되면 Rd = 0, 그렇지 않으면 1
STREX는 메모리를 업데이트하는데 성공했는지 여부를 나타내는 결과 코드를 반환예시
LDREX r0, [r1] ; r1이 가리키는 메모리 주소에서 데이터를 독점적으로 로드하여 r0에 저장 STREX r2, r3, [r1] ; r3의 값을 r1이 가리키는 메모리 주소에 저장하고, 성공 여부를 r2에 반환
SWP 명령어는 로드와 스토어 사이에 처리가 필요하지 않을 때만 유용MOV r1, #0x1 ; 'lock taken' 값을 로드
try_for_lock
LDREX r0, [LockAddr] ; 락 값을 로드
CMP r0, #0 ; 락이 비어 있는지 확인
STREXEQ r0, r1, [LockAddr] ; 비어 있다면 소유권을 요청해보기
CMPEQ r0, #0 ; 성공적으로 요청되었는지 확인
BNE try_for_lock ; 요청이 실패했다면 다시 시도
... ; 성공 - 이제 락을 보유함
SRS<DA|DB|IA|IB> #mode{!}
RFE<DA|DB|IA|IB> Rn{!}

SRS DB #0x1F0!
RFE IA r2!
이러한 명령어들은 예외 처리를 위한 효율적인 진입 및 종료를 위해 사용
<DA|DB|IA|IB>
SRS와 RFE 명령어에서 사용되는 모드 지정자
- 레지스터 r13 (일반적으로 스택 포인터)를 선택하는 데 사용
1. DA (Decreasing After)
: 스택 포인터 값을 저장한 후 값을 감소시킵니다.
2. DB (Decreasing Before)
: 스택 포인터 값을 감소시킨 후 값을 저장합니다.
3. IA (Increasing After)
: 스택 포인터 값을 저장한 후 값을 증가시킵니다.
4. IB (Increasing Before)
: 스택 포인터 값을 증가시킨 후 값을 저장합니다.