Linux Assembly
--김도집 (2006.1.)
Contents
- 1 Assembly Code
- 2 Inline Assembly
1 Assembly Code #
.macro xxx,val
mov r0, \val
.endm
2 Inline Assembly #
다음은 인라인 어셈블리의 한 예이다.
__asm__ __volatile__ ("\n\
mrc p6, 0, r1, c1, c, 0 @ Read out ICMR\n\
and r1, r1, %0 \n\
mcr p6, 0, r1, c1, c0, 0 @ Write back"
:
:"r"(temp)
:"r1");
위에서 보는 바와 같이 인라인 어셈블리의 형식은 다음과 같다.
__asm__ __volatile__(어셈블리 문장 : 출력 : 입력 : 변경된 레지스터);
__volatile__의 경우엔 생략이 가능하나 컴파일러의 임의 변경을 막고자 한다면 넣어야 한다.
출력, 입력, 변경된 레지스터 등에는 어떤 값도 들어가지 않을 수도 있다. 반대로 하나 이상의 값이 필요하다면 컴마(,)로 구분하면 된다.
앞서 예에서 "r"과 같이 사용되는 것이 constraint라고 한다. 자주 사용되는 constratint를 다음과 같다.
Constraint | 설명 |
m | 메모리 주소 |
r | 레지스터 |
i | 상수 값 |
g | 앞서 설명한 어느 것도 될 수 있다 |
0, 1, 2 ... | 앞서 선언한 값 |
= | 출력용으로 사용한다 |