2019独角兽企业重金招聘Python工程师标准>>>
因为要知道cortex m0程序调用的帧结构,对PUSH {r0,r1,r2}的入栈顺序不了解,英文文档比较难啃,没找到在那里描述,通过试验的方法得出结果,试验代码:
1 __asm volatile ( " MOV r0, #12\n " );
2 __asm volatile ( " MOV r1, #13\n " );
3 __asm volatile ( " MOV r2, #14\n " );
4 __asm volatile ( " PUSH {r0, r1, r2}\n " );
5
6 pu32SP = __get_MSP();
7
8 printf( " 0 %08x\r\n " , pu32SP[ 0 ]);
9 printf( " 4 %08x\r\n " , pu32SP[ 1 ]);
10 printf( " 8 %08x\r\n " , pu32SP[ 2 ]);
2 __asm volatile ( " MOV r1, #13\n " );
3 __asm volatile ( " MOV r2, #14\n " );
4 __asm volatile ( " PUSH {r0, r1, r2}\n " );
5
6 pu32SP = __get_MSP();
7
8 printf( " 0 %08x\r\n " , pu32SP[ 0 ]);
9 printf( " 4 %08x\r\n " , pu32SP[ 1 ]);
10 printf( " 8 %08x\r\n " , pu32SP[ 2 ]);
运行结果
0 0000000c
4 0000000d
8 0000000e
由于cortex m0是递减堆栈,所以可以看到最先入栈的是r2,最后入栈的是r0
PUSH {r0, r1, r2}的入栈顺序是从左到右,r2->r1->r0