ARM은 mobile/embedded 맞춤.. 초기 임베디드 시장은 32bit를 지원하는 ARM이 아닌 16bit가 대세라
ARM을 반쪽으로 만든 Thumb 존재..
| Thumb mode | ARM mode |
|---|---|
| 레지스터 R0~r15 기계어 2bytes |
레지스터 R0~R7 기계어 4bytes 해당 모드 간 전환 자유로움 x로 끝나는 분기문 명령으로 전환 |
이걸 리버싱 할 때도 유념해야 하는듯
- 레지스터

범용
- r0~r3 : 인자, 반환값 저장 / return은 r0으로..
이 레지스터를 넘어가면 stack으로.. - r4~r11(r9 제외) : general purpose register
- r11 : base pointer (amd에서 rbp,ebp 역할)
- r13 : sp
- r14 : link register.
- link register: 함수 call 뒤에 return 될 위치 저장, ret 역할
- r15: pc, 실행되는 code 위치 저장
접은 글은 LR에 대하여..
스택에 RET 저장이 아니라 LR에 따로 레지스터에 주소를 남겨줘서 ARM bof는 경우가 좀 다른듯
- lr을 스택에 저장하거나
- 다른 함수 stack frame을 덮을 수 있거나
보통은 1 경우라고 함
상태, mode 전환 시 이용
fps
cpsr
- Passing Arguments via Registers

Procedure Call //arm에서는 subroutine을 procedure이라고 더 많이 부르나..
BL label ; LR = 이 다음 instruction addr
; PC = label
BX LR ; PC = LR
이참에 branch 정리하고 가자
- b: branch, 상대 주소 기반 점프
- bx: branch and exchange, 레지스터 기반 절대주소
- bl: branch with link, 주소 점프(오프셋) + lr에 RET 저장
- blx: branch with link and exchange, 레지스터 점프 + lr에 RET 저장
하위 두 개가 RET 저장되니까 call에 많이 불리지 않을까….
위 접은글 보면 bl을 통해 LR 설정..
컴파일러는 label을 memory address로 translate..
BL은 caller, callee에서 BX
인자는 callee에서 깔아주는듯

R0부터 first argument 넣음
return은 r0으로 넣고 bx..
stack에 넣을 때는.. [sp,#0] 이런 식으로 넣는듯
ARM 명령은 conditional execution..
해당 conditional execution은 CPSR state에 따라 instruction 실행하는 것을 말함
ADDEQ r1,r2,r3
위 예시처럼 add 뒤에 EQ가 붙었다. 이 명령은 CPSR 30번째 비트 Z를 확인하고 이값이 1인 경우만 실행한다고 한다.
//CPSR 레지스터를 더 자세히.. 파야 할듯
CPSR(Current Program Status Register)

여기에는 ALU status flags 있음 -> instruction 결과에 따라 update
맨 앞 N,Z,C,V를 condition code flag라고 함..
- N: 음수
- Z: 0
- C: arry 올림
- V: oVerflowed
이부분의 값을 참조하여 조건부 명령 가능 (if문처럼..)
| Code | Suffix | Description | Flags tested |
|---|---|---|---|
| 0000 | EQ | Equal | Z=1 |
| 0001 | NE | Not Equal | Z=0 |
| 0010 | CS | Unsigned higher or same | C=1 |
| 0011 | CC | Unsigned lower | C=0 |
| 0100 | MI | Minus (negative) | N=1 |
| 0101 | PL | Positive or Zero | N=0 |
| 0110 | VS | Overflow | V=1 |
| 0111 | VC | No overflow | V=0 |
| 1000 | HI | Unsigned higher | C=1 & Z=0 |
| 1001 | LS | Unsigned lower or same | C=0 or Z=1 |
| 1010 | GE | Greater or Equal | N=V |
| 1011 | LT | Less than | N!=V |
| 1100 | GT | Greater than | Z=0 & N=V |
| 1101 | LE | Less than or equal | Z=1 or N=!V |
| 1110 | AL | Always |
LDR/STR
메모리 참조 가능한 명령어
- LDR/STR with offsets
- LDR with labels