coretex M33 register save.
typedef struct MY_REG{
unsigned long r0;
unsigned long r1;
unsigned long r2;
unsigned long r3;
unsigned long r4;
unsigned long r5;
unsigned long r6;
unsigned long r7;
unsigned long r8;
unsigned long r9;
unsigned long r10;
unsigned long r11;
unsigned long r12;
unsigned long r13;
unsigned long r14;
unsigned long r15; // PC
}MY_REG;
MY_REG my_reg_save;
void save_reg_data(MY_REG *save_reg)
{
asm volatile(
“str r0, [%0, #0]\n\t” /* R0 push to save_reg */
“mov r0, %0\n\t” /* R0 */
“str r1, [r0,#4]\n\t” /* R1 */
“str r2, [r0,#8]\n\t” /* R2 */
“str r3, [r0,#12]\n\t” /* R3 */
“str r4, [r0,#16]\n\t” /* R4 */
“str r5, [r0,#20]\n\t” /* R5 */
“str r6, [r0,#24]\n\t” /* R6 */
“str r7, [r0,#28]\n\t” /* R7 */
“str r8, [r0,#32]\n\t” /* R8 */
“str r9, [r0,#36]\n\t” /* R9 */
“str r10, [r0,#40]\n\t” /* R10 */
“str r11, [r0,#44]\n\t” /* R11 */
“str r12, [r0,#48]\n\t” /* R12 */
“str r13, [r0,#52]\n\t” /* R13 - SP */
“str r14, [r0,#56]\n\t” /* R14 - LR*/
“sub r1, r15, #0x30\n\t” /* PC */
“str r1, [r0,#60]\n\t”
“mrs r1, xpsr\n\t” /* xPSR */
- “str r1, [r0,#64]\n\t”
-
//output
:”r”(save_reg) //input
:”%r0”,”%r1” //chnanged value
);
}
/*
inline volatile asm funcion.
-
asm
-
output
-
input
-
changed value
example : asm volatile(“asm code” : output value : input value : changed value);
int test_asm_volatile(int input)
{
int output;
asm volatile(“str r0, [%0]\n\t”, output: “r”(input):”%r0”);
}
*/
참고
http://jake.dothome.co.kr/inline-assembly/
http://www.ethernut.de/en/documents/arm-inline-asm.html
https://toanyone.net/arm-inline-asm
https://wiki.kldp.org/KoreanDoc/html/EmbeddedKernel-KLDP/app3.basic.html
\