본문 바로가기

임베디드/ARM

ARM GCC Inline assembly coding

1. Basic Example

2. Syntax

3. Input/ouput operands and Constraint string

 

※ 어셈블리는 컴파일러 마다 문법이 다르다.


1. Basic Example

ex1) 

MOV R0, R1 : __asm volatile("MOV R0, R1"); or asm ("MOV R0, R1");

 

ex2) 

LDR R0, [R1] 

LDR R1, [R2]

ADD R1, R0 

STR R1, [R3] 

위의 식은 아래와 같이 표현 가능하다.

void fun_add(void)
{
    __asm volatile ("LDR R0,[R1]");
    __asm volatile ("LDR R1,[R2]");
    __asm volatile ("ADD R1,R0");
    __asm volatile ("STR R1,[R3]");
    
    __asm volatile (
    	"LDR R0,[R1]\n\t"
        "LDR R1,[R2]\n\t"
        "ADD R1,[R0]\n\t"
    	"STR R1,[R3]\n\t"
    );
}

 

2. Syntax

__asm volatile (code: output operand list: input operand list: clobber list);

 

 

3. Input/ouput operands and Constraint string

"<Constraint string>" (<'C' expression>)

 

Constraint string = constraint character + constraint modifier

 

ex3)

Copy the contents of 'C' variable 'val' to ARM register R0

--> C언어 변수 'var' 에 저장된 값을 R0 레지스터로 이동시키기

 

int val = 50;
__asm volatile ("MOV R0, %0":  : "r"(var) );

==> (컴파일러 해석) 

ldr r3, [r7, #4]

mov r0, r3

 

(혹은 같은 명령, 다른 표현)

__asm volatile ("MOV R0, %0":  : "r"(0x50) );

__asm volatile ("MOV R0, %0":  : "i"(0x50) );  //i는 immediate value

 

'r' is a constraint character

val is 'C' variable name

 

ex4)

Copy the contents of CONTROL register to ARM register R0

--> CONTROL 레지스터에 저장된 값을 R0 레지스터로 이동시키기

 

int control_reg;
__asm volatile ("MRS %0,CONTROL" : "=r"(control_reg) : : );

 

To read CONTROL register, you have to use MRS instruction.

 

<Syntax>

MRS{cond} Rd, spec_reg

 

ex4-1)

MRS R0, PRIMASK : Read PRIMASK value and write it to R0.

 

Modifier Specifies
= Write-only operand, usually used for all output operands
+ Read-write operand, must be listed as an output operand
& A register that should be used for output only

 

ex5)

Copy the contents of 'C' variable var1 to var2

--> C언어 변수 'var1' 에 저장된 값을 'var2'로 이동시키기

 

int var1 = 10, var2;
__asm volatile ("MOV %0, %1": "=r"(var2) : "r"(var1) );

 

 

ex6)

Copy the contents of a pointer into another variable

-->포인터에 저장된 값을 다른 포인터 변수로 이동시키기

 

int p1, *p2;

p2 = (int*)0x20000008;

__asm volatile ("LDR %0, [%1]": "=r"(p1) : "r"(p2) );  //p1 = *p2;

==> (컴파일러 해석) 

ldr r3, [r7, #4]

ldr r3, [r3, #0]  <-- r3 dereferenced

str r3, [r7, #0]


[Reference]

www.udemy.com/course/embedded-system-programming-on-arm-cortex-m3m4/

반응형

'임베디드 > ARM' 카테고리의 다른 글

ARM Q&A  (0) 2021.06.09
000_ARM Contents  (0) 2021.03.20
Cortex-M3/M4 Utils  (0) 2021.03.20
Core Register & CMSIS  (0) 2021.03.09
ARM 교육 받을 수 있는 곳  (0) 2021.02.13