arm gcc 기준
아주 좋은 참고 링크
http://www.joinc.co.kr/w/Site/Embedded/Documents/LinuxKernelStudyForSystemenginer/app3.basic.html
https://wiki.kldp.org/wiki.php/DocbookSgml/GCC_Inline_Assembly-KLDP
작성해주신 고마운 분들에게 감사를
cmsis 라이브러리 예제 파일들
cmsis_gcc.h
io.h
그 외 linux kernel /arch/arm/include/asm/*
arch/x86/include/asm/*
들이 있다
__attribute__((always_inline)) static inline uint32_t test_return(void)
{
uint32_t ret;
__asm volatile (
"MOV %0, #41 \n"
: "=r" (ret)
);
return ret;
}
uint32_t test_return(void)
{
uint32_t ret;
ret = 41;
return ret;
}
__attribute__((always_inline)) static inline uint32_t test_arg_return(uint32_t arg)
{
uint32_t ret;
__asm volatile (
"MOV %0, %1 \n"
: "=r" (ret)
: "r" (arg)
);
return ret;
}
uint32_t test_arg_return(uint32_t arg)
{
uint32_t ret;
ret = arg;
return ret;
}
__attribute__((always_inline)) static inline uint32_t test_arg_return(uint32_t arg, uint8_t *addr)
{
uint32_t ret;
#if 0
__asm volatile (
"LDRB r3, %2 \n"
"MOV %0, r3 \n"
: "=r" (ret)
: "r" (value), "Q" (*addr)
);
#else
uint32_t tmp;
__asm volatile (
"LDREXB %1, %3 \n"
"MOV %0, %1 \n"
: "=r" (ret), "+r" (tmp)
: "r" (value), "Q" (*addr)
);
#endif
return ret;
}
uint32_t test_arg_return(uint32_t arg, uint8_t *addr)
{
uint32_t ret;
#if 0
ret = *addr;
#else
uint32_t tmp;
tmp = *addr;
ret = tmp;
#endif
return ret;
}
__attribute__((always_inline)) static inline uint32_t core_test(uint8_t value, volatile uint8_t *addr)
{
uint32_t ret;
#if 1
__asm volatile (
"LDRB r3, %2 \n"
"MOV %0, r3 "
: "=r" (ret) //return value?"
: "r" ((uint32_t) value), "Q" (*addr)
);
#else
//uint32_t tmp;
__asm volatile (
"STREXB %0, %2, %1"
: "=r" (ret), "=Q" (*addr)
: "r" ((uint32_t) value));
#endif
return ret;
}