4. ARM Assembly Programming
4์ฅ ARM Assembly Programming ๊ฐ์
ARM Assembly์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ๊ณผ ์ค์ ํ๋ก๊ทธ๋๋ฐ์ ํ์ํ ๋ช ๋ น์ด, Immediate operation, Shifted Register Operands, Addressing Mode, Branch, Subroutine ๋ฑ์ ๋ค๋ฃฌ๋ค.
ARM Assembly ๊ธฐ๋ณธ ๊ตฌ์กฐ
[label] instruction [operands] [; comment]
- Label: ์ฝ๋ ๋ผ์ธ์ ์ด๋ฆ์ ๋ถ์ฌ jump target ์ง์
- Instruction: ARM mnemonic
- Operands: ์ฃผ๋ก register, immediate, label
- Comment:
;๋ก ์์
General Features
ARM Assembly์ ์ผ๋ฐ์ ์ธ ํน์ง.
- Arithmetic, Logical Operations: ADD, SUB, AND, ORR ๋ฑ
- ALU ์ฐ์ฐ์ register-to-register, ์ต๋ 3 operand
Suffixed Format
<instruction>{S}{cond} ํํ. S๋ flag update, cond๋ conditional execution.
์: ADDEQS r0, r1, r2 โ EQ ์กฐ๊ฑด์ด ์ฐธ์ผ ๋๋ง ์คํ, flag ๊ฐฑ์
Simple Register Operands
- ADD r0, r1, r2:
r0 = r1 + r2 - 3 operand ๋๋ 2 operand form
Arithmetic Operation
- ADD, SUB, RSB (reverse subtract), ADC (add with carry), SBC, RSC
- ์ RSB๊ฐ ํ์ํ์ง: ARM์
r0 <mark class="highlight"><strong><u> r1 - r2์r0 </u></strong></mark> r2 - r1์ immediate ํ์ฉ ์ ๋ชจ๋ ์ ์ฉ
Bitwise Logical Operation
- AND, ORR, EOR (XOR), BIC (bit clear = AND NOT)
- ์:
BIC r0, r1, #0xFFโ r1์ ํ์ 8bit๋ฅผ ๋ชจ๋ 0์ผ๋ก
Bit Shift Operation
- MOV, MVN (move NOT), shift ํฌํจ ๊ฐ๋ฅ
Comparison Operation (No destination)
- CMP (compare SUB, flag๋ง), CMN (compare negative ADD, flag๋ง)
- TST (test AND, flag๋ง), TEQ (test equal EOR, flag๋ง)

Immediate Operation
ํ๋์ operand (๋ค์ operand)๋ ์์๋ก ์ฌ ์ ์์ (#์ ์ด์ฉ).
์: ADD r3, r3, #1, ADD r8, r7, #&ff
์์ ์ค์ ์กฐ๊ฑด
ARM instruction์ 32-bit ๊ณ ์ ์ด๋ผ immediate์๋ 12 bit ๊ณต๊ฐ. Cond | opcode | 12bit(rn) | 4bit(r1) | 4bit | 4bit 12bit.
- ์์ ๋ฒ์: $0 \sim 2^{12} - 1$๊น์ง๋ง ํํ ๊ฐ๋ฅ
- 12-bit์ ๋ ์ ์ฌ์ฉํ๊ธฐ ์ํด (๋ง์ด ์ฌ์ฉํ๋ bit๋ง) shift์์ผ ์ฌ์ฉ
- $(0 \sim 2^8 - 1) \times 2^{2n} = (0 \sim 2^8 - 1) \ll 2n$ โ 8bit ร non 4bit shift
- 4bit์ ์ฌ์ฉํด์ $0 \leq n \leq 12$๊น์ง ํํ
- Encodeํ ์ ์๋ ๊ฐ์ด๋ฉด Assembler๊ฐ ๊ฒฝ๊ณ
Shifted Register Operands
3 or 4 address instruction: 2๋ฒ์งธ reg operand๋ฅผ shiftํ ์ ์๊ธฐ์ 4 address I.
์: ADD r3, r2, r1, LSL #3 โ r3 = r2 + 8*r1
<<3์ 8์ ๊ณฑํด์ค ๊ฒ๊ณผ ๊ฐ์- ๊ณฑ์ ๊ธฐ๋ 1 clock ์์ ์ํ๋์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ โ shift ์ฐ์ฐ์ ์ํํ๋ฉด ๊ณฑ์ ๋ 1 clock์ ์ํ ๊ฐ๋ฅ (ARM์ ํน์ง, ๋ค๋ฅธ ํ๋ก์ธ์๋ ๋ณ๋ ์์)
reg๋ก ์ฌ์ฉ๋ ๊ฐ๋ฅ. ์: ADD r5, r5, r3, LSL r2 โ r5 = r5 + r3 * 2^r2
Shift Mnemonics
- LSL(R): Logical shift left (Right)
- ASL(R): Arithmetic shift left (Right) โ ASR์ ๊ฒฝ์ฐ Sign-extension์ ํด์ค LSR๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฆ
- ROR: Rotate right
- RRX: Carry๋ ํฉ์ณ์ Rotate

Setting Condition Code
๊ฐ Data processing I์ condition code suffix๋ฅผ ์ฐ๋ฉด:
- S suffix condition code ๊ฒฐ๊ณผ๊ฐ CPSR์ ๋ฐ์
Multiplication
- MUL r0, r1, r2 โ
r0 = (r1 * r2)[31:0](ํ์ 32bit๋ง) - MLA r0, r1, r2, r3 โ
r0 = (r1 * r2 + r3)[31:0](multiply accumulate) - Multiply and accumulate: MLA r0, r1, r2, r3; MLAS (condition code ๋ฐ์)
Data-Transfer Instruction (Load/Store)
Register๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ load/store.
- Single register load/store (LDR, STR): byte/halfword/word
- Multiple register load/store (LDM, STM): block transfer
Register Indirect Addressing
์: LDR r0, [r1] โ r0 <mark class="highlight"><strong><u> mem[r1], STR r0, [r1] โ mem[r1] </u></strong></mark> r0
Initializing an Address Pointer
Load from: Load from label; ํ์ฌ PC ๊ธฐ์ค.

Pointing label 1 and label 2
๋ฉ๋ชจ๋ฆฌ ์์ labeled data์ pointer ์ค์ ์์ .
Single Register Load/Store I
Base with offset, pre/post indexed auto-increment ์์ ๋ฅผ ํตํด ๊ตฌ์กฐ ์ดํด.
Base + Offset Addressing
- Pre-indexed addressing:
LDR r1, [r0, #4]โr1 = mem[r0 + 4], r0 ๋ณ๊ฒฝ X - Pre-indexed with writeback:
LDR r1, [r0, #4]!โr1 <mark class="highlight"><strong><u> mem[r0 + 4],r0 </u></strong></mark> r0 + 4 - Post-indexed:
LDR r1, [r0], #4โr1 <mark class="highlight"><strong><u> mem[r0],r0 </u></strong></mark> r0 + 4

Multiple Register Data Transfer
์ฌ๋ฌ register๋ฅผ ํ ๋ฒ์ load/store.
- LDM (Load Multiple):
LDMIA r0!, {r1-r3}โr1 <mark class="highlight"><strong><u> mem[r0],r2 </u></strong></mark> mem[r0+4],r3 <mark class="highlight"><strong><u> mem[r0+8],r0 </u></strong></mark> r0 + 12 - STM (Store Multiple): ๋์ผํ๊ฒ ์ ์ฅ
Addressing Mode
- IA (Increment After), IB (Increment Before), DA (Decrement After), DB (Decrement Before)
- Stack์์ ์ฐ์ด๋ ๊ฒฝ์ฐ: FD (Full Descending), FA, ED, EA
Stack Addressing
- Full stack (F): SP๊ฐ ๋ง์ง๋ง ์ ์ฅ๋ ๊ฐ์ ๊ฐ๋ฆฌํด
- Descending stack (D): stack์ด ๋ฎ์ ์ฃผ์๋ก ์ฑ์ฅ
ARM์ ํ์ค Full Descending (FD) stack์ ์ฌ์ฉ.
Block Copy Addressing
LDMIA/STMIA ์กฐํฉ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ block์ ํจ์จ์ ์ผ๋ก ๋ณต์ฌ.

Block Copy Addressing Usage
- LDMIA r8!, {r0-r3}: Load Multiple Increment After (4๊ฐ ๋ ์ง์คํฐ์ load, r8 update)
- STMIA r9!, {r0-r3}: Store Multiple Increment After
- โ Block copy loop ๊ตฌ์กฐ์ ํต์ฌ
๋น์ทํ๊ฒ:
- Full descending stack (STMFD/LDMFD): Stack push/pop
- Descending stack, full-empty check
Branch Instruction
- Unconditional jump:
B label,BL label - Conditional jump:
BEQ label,BNE label๋ฑ
PC relative addressing, offset 24-bit โ ยฑ32MB ๋ฒ์ jump ๊ฐ๋ฅ.

Branch Condition
| Branch | Interpretation | Flag state |
|---|---|---|
| BEQ | Equal | Z=1 |
| BNE | Not equal | Z=0 |
| BCS/BHS | Carry set/unsigned high or same | C=1 |
| BCC/BLO | Carry clear/unsigned low | C=0 |
| BMI | Minus | N=1 |
| BPL | Plus | N=0 |
| BVS | Overflow set | V=1 |
| BVC | Overflow clear | V=0 |
| BHI | Higher (unsigned) | C=1 AND Z=0 |
| BLS | Lower or same (unsigned) | C=0 OR Z=1 |
| BGE | Greater or equal (signed) | N=V |
| BLT | Less than (signed) | Nโ V |
| BGT | Greater than (signed) | Z=0 AND N=V |
| BLE | Less or equal (signed) | Z=1 OR Nโ V |
Conditional Execution
์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก branch ํ ๋ conditional execution์ ์ฌ์ฉํ๋ค.
if (r1 > r0) { r0 <mark class="highlight"><strong><u> r0 - 2; } else { r0 </u></strong></mark> r0 + 2; }
์ผ๋ฐ์ branch ์ฌ์ฉ ์:
CMP r0, r1
BGT ELSE
SUB r0, r0, #2
B END
ELSE:
ADD r0, r0, #2
END:
Conditional execution ์ฌ์ฉ ์:
CMP r0, r1
SUBLE r0, r0, #2 ; condition์ด LE์ด๋ฉด ์คํ
ADDGT r0, r0, #2 ; condition์ด GT์ด๋ฉด ์คํ
โ Branch๋ฅผ ์์ pipeline์ด ํจ์จ์ . ARM ํน์ ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ.

Branch and Link Instructions
Subroutine ์ํ ํ ์๋ ์ฝ๋๋ก ๋์์ฌ ๋ ๋ง์ด ์ฌ์ฉ.
- BL SUBR: Branch to SUBR with Link
r14 = r15 - 4(return address ์ ์ฅ) โ PC์ LR์ ๋ณต์- B SUBR: Branch only (no link)
Nested Call์ผ ๊ฒฝ์ฐ
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ๋ฌธ์ ๋ฐ์ โ r14๋ฅผ stack์ pushํด์ค ํ์๊ฐ ์์ (subroutine์์ subroutine์ callํ ๊ฒฝ์ฐ).
์:
BL SUB1 ; branch to SUB1, r14 โ โณ (โณ๋ ํ์ฌ PC + #4)
; return to here
SUB1 STMFD r13!, {r0-r2, r14} ; save work & link regs
BL SUB2 ; r14 โ โก
...
SUB2 ...
โ โณ์ ๋ค ๋ฎ์ด์ฐ๊ธฐ์ โณ๋ก ๋์๊ฐ ๋ฐฉ๋ฒ์ด ์์!
ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก STMFD I์ ์ํ โ r14๋ฅผ stack์ ์ ์ฅํ๊ณ ๋ฎ์ด์. Full Descending ๋ฐฉ์. ๋์ค์ stack์์ ๋ค์ ๊บผ๋ด์ ๋์์ฌ ์ฃผ์ ๊ฐ์ ธ์ด.
Subroutine Return Instructions
SUB2 ...
MOV pc, r14 ; copy r14 into r15 to return
BL SUB1
SUB1 STMFD r13!, {r0-r2, r14} ; save work regs/link โ stack์ r14 ์ ์ฅ
BL SUB2
...
LDMFD r13!, {r0-r2, pc} ; restore work regs/link โ ๋์ค์ r14์์ ๊ฐ์ ธ์ด
; MOV PC, r14๋ฅผ ์๋ตํ๊ธฐ ์ํด r14 ๋์ PC๋ฅผ ์
Supervisor Calls (Privileged level์์ ๋์)
Supervisor: ํน๊ถ level์์ ๋์ํ๋ ํ๋ก๊ทธ๋จ, user level๋ณด๋ค ๋์ ์ฐ์ ์์, system level I๋ก ๊ตฌํ.
SWI (Software Interrupt)
ํน๋ณํ subroutine์ callํ๋ I (call ํ device๋ฅผ ์ํํด์ผ ํ๋์ง ํ์ธํ๋ ์ฝ๋).
์: r0์ bottom Byte๋ฅผ display๋ก ๋ณด๋:
SWI SWI_WriteC ; output r0[7:0] โ r0์ ํ์ ์ฒซ Byte ์ถ๋ ฅ (User level program์ด
; ๋ชจ๋ํฐ์ ๋ํ ์ ์ด๊ถ์ ๊ฐ์ง)
SWI SWI_Exitโ return to monitor (์ ์ด๊ถํ์ Monitor๋ก ๋๋ ค์ค)

Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.