어셈블리어 명령어
MOV
ARM은 레지스터간 데이터 복사는 MOV 명령을 사용한다.
ex) MOV R0, R1 --> R1의 내용을 R0에 복사한다.
또한, 주변장치의 레지스터는 '메모리'이므로 MOV 명령으로 제어가 불가능하다.
LDR, STR
ARM은 레지스터와 메모리간 이동은 LDR, STR명령을 사용한다.
주변장치의 레지스터 (메모리)는 LDR, STR 명령을 사용하자.
레지스터 --> 메모리 : LDR(Load to Register)
메모리 --> 레지스터 : STR(Store to Memory)
상수값을 레지스터로 LOAD하기
LDR Rn, =value
value는 최대 4바이트 값.
Rn은 r0 ~ r15 값.
MOV r0, #value
레지스터 간 복사는 MOV 명령을 사용하자.
레지스터 간접참조하기
LDR Rd, [Rs] --> Rs 레지스터 값을 메모리 주소로 하여 내용을 Rd로 Load.
STR Rs, [Rd] --> Rd 레지스터 값을 메모리 주소로 하여 내용에 Rs를 Store.
LDR, STR Post Indexing
LDR Rd, [Rs], #value --> Rs 레지스터 값을 메모리 주소로 하여 내용을 Rd로 Load하고, value를 더한다.
STR Rs, [Rd], #value --> Rd 레지스터 값을 메모리 주소로 하여 내용에 Rs를 Store하고, value를 더한다.
LDR, STR Pre Indexing
LDR Rd, [Rs, #value] --> Rs 레지스터 값에 value를 더한 값을 메모리 주소로 하여 내용을 Rd로 Load.
STR Rs, [Rd, #value] --> Rd 레지스터 값에 value를 더한 값을 메모리 주소로 하여 내용에 Rs를 Store.
LSL, LSR shift
LSL #n
좌측으로 지정한 비트 수만큼 shift.
최후에 밀려난 비트가 상태레지스터의 C(Carry) flag에 저장됨. (signed/unsigned 곱하기 2)
LSR #n
우측으로 지정한 비트 수만큼 shift.
최후에 밀려난 비트가 상태레지스터의 C(Carry) flag에 저장됨. (unsigned 나누기 2, 비트 shift)
ASR shift
ASR #n
우측으로 지정한 비트 수만큼 부호유지하면서 shift.
MSB(Most Significant Bit, 부호) 유지하고 밀려난 비트는 상태레지스터 C(Carry) flag에 저장함.
ROR, RRX shift
ROR #n
Rotate Right. 밀려난 비트는 C flag에 저장.
RRX #n
Carry 포함해서 Rotate Right. 비트 수는 무조건 1비트만 rotate 가능.
비트제어 명령어
ORR --> 원하는 비트만 1로 set
EOR --> 원하는 비트만 반전
AND --> 원하는 비트만 0으로 clear
BIC --> 원하는 비트만 0으로 clear (AND보다 편리)
label
파일 내에서 중복되지 않는 label로 분기
.global directive --> 다른 파일에서 참조 허용 (C언어의 extern 개념)
.extern directive --> 다른 파일의 Label 참조
B 1b --> Backward로 가장 가까운 1로 분기 (다른 파일에서 참조 불가능)
B 1f --> Forward로 가장 가까운 1로 분기 (다른 파일에서 참조 불가능)
비교 연산 명령어
CMP, CMN
TST --> 특정 비트 check, 비교 비트가 1이면 Z clear, 0이면 Z set
TEQ --> 비트패턴(블록)이 동일하면 Z set
상태레지스터 flag
N (Negative) --> 연산 결과가 음수인 경우 set
Z (Zero) --> 연산 결과가 0인 경우에 사용
C (Carry) --> 덧셈 carry에 set, 뺄셈 borrow에 clear, rotate 시 밀린 비트 저장
V (Overflow) --> signed 덧셈, 뺄셈 연산 결과로 값의 초과가 발생한 경우
서브루틴 호출
BL add --> add 서브루틴 호출 후 복귀
BX LR --> LR 값을 PC에 대입하여 복귀
'한국으로 > ARM' 카테고리의 다른 글
다중 메모리 이동: LDM, STM (0) | 2018.07.22 |
---|---|
AAPCS와 레지스터 테이블 (0) | 2018.07.21 |
ARM의 특수 용도 레지스터 (0) | 2018.07.21 |
호출 규약 __cdecl 과 __stdcall의 차이점 (0) | 2018.07.21 |
volatile이 필요한 경우 (0) | 2018.07.21 |
C Runtime Startup (0) | 2018.07.21 |
어셈블리어로 반복 프로그램 짜기 (0) | 2018.07.21 |
ARM 프로세서 개요 (0) | 2018.07.21 |