FSTWikiDiff for 1.5 김도집/Assembly
Login:
Password:
Join
U E D R S I H P RSS
FrontPage|FindPage|TitleIndex|RecentChanges

Difference between r1.5 and the current

@@ -6,10 +6,16 @@

= Assembly Code =
{{{
.set symbol, expression 
}}} 
 
{{{ 
.ifdef xxxsymbol
.else
.endif
}}}
/!\ ifdef문에서 symbol은 {{{#define}}}문으로 선언하는 매크로가 아니다. 

{{{
.align 5
@@ -22,6 +28,8 @@
{{{
.include "xxx.inc"
}}}
/!\ {{{#include}}}와 달리 {{{.include}}}문으로 포함시키면 #로 시작하는 전처리기는 무시된다. 

{{{
.text
@@ -36,7 +44,9 @@
{{{
.glbl xxx
}}}
어셈블리에서 .glbl 또는 .global로 export된 심볼은 C코드에서 일반 함수처럼 사용할 수 있다. C코드에서는 extern을 이용하여 함수 원형을 선언한 후 사용한다.

어셈블리에서 인자 및 리턴 값은 r0, r1, r2 등이 인자가 되며 리턴 전의 r0 값이 리턴 값이 된다.
= Inline Assembly =
다음은 인라인 어셈블리의 한 예이다.
{{{#!vim c
@@ -58,13 +68,26 @@

출력, 입력, 변경된 레지스터 등에는 어떤 값도 들어가지 않을 수도 있다. 반대로 하나 이상의 값이 필요하다면 컴마(,)로 구분하면 된다.

앞서 예에서 "r"과 같이 사용되는 것이 constraintconstraints라고 한다. 자주 사용되는 constratintconstratints를 다음과 같다. 
||'''ConstraintConstraints'''||'''설명'''||
||m||메모리 주소||
||r||레지스터||
||i||상수 값||
||g||앞서 설명한 어느 것도 될 수 있다||
||0, 1, 2 ... ||앞서 선언한 값||
 
다음은 constraints의 속성을 변경할 수 있는 modifier이다.
||=||출력용으로 사용한다||
||&||earlyclobber||

earlyclobber라 함은 입력값을 이용하는 명령이 다 종료되기 이전에 그 값이 다른 값으로 변경 될 수 있음을 알리는 것이다. 일반적으로 gcc는 입력으로 사용되는 것의 결과가 다 처리된 이후에 그 값이 변경되는 것을 허용하게 된다. 그런데 경우에 따라서는 그 전에 그 값이 변경될 필요가 있다. 이런 경우에 사용하게 된다. 
 
다음은 리눅스 커널 상에서 사용된 인라인 어셈블리의 예이다. 
{{{#!vim c 
u32 chiprev; 
asm("mrc%? p15, 0, %0, c0, c0" : "=r" (chiprev)); 
if ((chiprev & CP15R0_VENDOR_MASK) != CP15R0_XSCALE_VALUE) { 
... 
}}}



Linux Assembly

--김도집 (2006.1.)

Contents

1 Assembly Code
2 Inline Assembly

1 Assembly Code #

.set symbol, expression

.ifdef symbol
.else
.endif
/!\ ifdef문에서 symbol은 #define문으로 선언하는 매크로가 아니다.


.align 5

.equ xxx,0x000000000

.include "xxx.inc"
/!\ #include와 달리 .include문으로 포함시키면 #로 시작하는 전처리기는 무시된다.


.text

.macro xxx,val
   mov r0, \val
.endm

.glbl xxx
어셈블리에서 .glbl 또는 .global로 export된 심볼은 C코드에서 일반 함수처럼 사용할 수 있다. C코드에서는 extern을 이용하여 함수 원형을 선언한 후 사용한다.

어셈블리에서 인자 및 리턴 값은 r0, r1, r2 등이 인자가 되며 리턴 전의 r0 값이 리턴 값이 된다.

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"과 같이 사용되는 것이 constraints라고 한다. 자주 사용되는 constratints를 다음과 같다.
Constraints설명
m메모리 주소
r레지스터
i상수 값
g앞서 설명한 어느 것도 될 수 있다
0, 1, 2 ... 앞서 선언한 값

다음은 constraints의 속성을 변경할 수 있는 modifier이다.
=출력용으로 사용한다
&earlyclobber

earlyclobber라 함은 입력값을 이용하는 명령이 다 종료되기 이전에 그 값이 다른 값으로 변경 될 수 있음을 알리는 것이다. 일반적으로 gcc는 입력으로 사용되는 것의 결과가 다 처리된 이후에 그 값이 변경되는 것을 허용하게 된다. 그런데 경우에 따라서는 그 전에 그 값이 변경될 필요가 있다. 이런 경우에 사용하게 된다.

다음은 리눅스 커널 상에서 사용된 인라인 어셈블리의 예이다.
u32 chiprev;
asm("mrc%? p15, 0, %0, c0, c0" : "=r" (chiprev));
if ((chiprev & CP15R0_VENDOR_MASK) != CP15R0_XSCALE_VALUE) {
  ...
}

last modified 2006-03-08 08:21:45
ShowPage|FindPage|DeletePage|LikePages Valid XHTML 1.0! Valid CSS! powered by MoniWiki
0.0360 sec