文章目录
C代码中调用汇编函数
tip1:如何写一个汇编函数
示例:READONLY后增加汇编函数
EXPORT ADD_OPT
ADD_OPT FUNCTION
ADD R0, R0,#1
BX LR
ENDFUNC
主函数内增加调用:
extern int ADD_OPT(void); //如果不加void,编译器会提示warn:warning: function declaration isn’t a prototype(函数声明不是原型)
int main(void)
{
int i = 0;
i = i +1 ;
ADD_OPT();
}
调试模式,reset,按F11单步执行:
执行了add+1操作:
增加mov 查看R1的值:
C代码中直接加入汇编语句
·嵌入的汇编语句
__asm{
汇编函数或代码
}
.内联的汇编语句
例如:
int main(void)
{
int i = 0;
i = i +1 ;
int r1; //若无此定义会提示:Implicit physical register R1 should be defined as a variable
__asm
{
ADDS r1,#1
}
}
__asm void add_opt()
{
ADDS R0,R1
BX LR
}
C语言中内嵌汇编asm语法可参考博文.
Tips:MDK注释显示中文
MDK的编码设置为chinese2312(Edit>Configuration>Editor>Encoding)。
Cortex-M架构CPU内核的寄存器及处理器模式
Cortex-M架构CPU内核寄存器
演示
打开启动文件,进入调试状态,reset:
F:\IOT\PRJ\first_prj\RTE\Device\STM32F407ZGTx\startup_stm32f407xx.s
执行一步,LR值变化:
增加指令: MOV R1,PC,
重新编译:
调试,reset,看一下PC的值:
由于是流水线指令,看到的值不同(实际上是当前地址+4后的值):
要特殊说明的几个寄存器
R13 MSP/PSP
R14 LR
R15 PC
2 特殊寄存器
程序状态奇存器 xPSR
Cortex-M架构CPU处理器操作状态,模式和特权级别
1 操作状态
Debug 状态
Thumb状态 (执行Thumb指令)
2 特权等级和操作模式
两种特权等级
特权级
非特权级(用户级):禁止写特殊寄存器和特殊状态寄存器
两种操作模式
Handler模式
Thread(线程)模式
3各状态和各模式及等级间的切换
MDK中的演示
更改internal中的CONTROL的0位为1:
影响到的值反色显示,变成了unprivilege
更改internal中的CONTROL的0位为3:
SP寄存器置0.继续执行,触发中断:
HardFault_Handler