请教,C语言如何访问CPU内部的寄存器



我一般自己写函数,函数如下:
由于函数的变量是由寄存器传递的,所以如果要得到原始的寄存器值,就不能使用带参数的函数。只能使用全局变量。
UINT16 register_num; //指定需要读取的CPU寄存器的号
0: INTBH 2:INTBL 4:FB 6: SB 8:A1 10:A0 12:R3 14:R2 16:R1 18:R0
20:PC(M+L) 22:FLG+PC(H) Other: SP
UINT16 register_value; //用于存储CPU寄存器
#pragma interrupt GetCPURegister //声明该函数使用中断编译,这样调用该函数时R0,R1,R2,R3,A0,A1,SB,FB,PC,FLG都自动被压栈了。(压栈顺序为上诉顺序的倒序)
VOID GetCPURegister( )
{
if(register_num <= 22) //读取除SP以外的变量
{
#pragma asm
PUSHC INTBL //压入INTBL
PUSHC INTBH //压入INTBH
STC SP, A0 //指定基地址,此时,SP指向INTBH,A0也指向INTBH
ADD.W _register_num, A0 //指定需要读取的寄存器地址
MOV.W [A0], _register_value //读出需要读取的寄存器
ADD.W # 4, SP //回复SP(因为压INTBL和INTBH的时候SP-4了)
#pragma endasm
}
else //读取SP
{
#pragma asm
STC SP, R0 //得到当前的SP
ADD.W #20, R0 //恢复到进入函数前的SP,
MOV.W R0, _register_value
#pragma endasm
}
}

回复
打赏帖 | |
---|---|
【Zephyr】使用Zephyr外设初始化过程解析被打赏30分 | |
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
赚取电动螺丝刀+电源电路理论知识分享1被打赏5分 | |
我想要一部加热台+分享常见运算放大器电路的应用被打赏5分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
我想要一部加热台+常见的MOS管驱动电路被打赏5分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录被打赏29分 | |
【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案被打赏20分 |