본문 바로가기
한국으로/ARM

어셈블리어 명령어

by 영킴. 2018. 7. 21.

어셈블리어 명령어


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