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 |