这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教,C语言如何访问CPU内部的寄存器

共9条 1/1 1 跳转至

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

助工
2008-07-30 09:10:47     打赏
C语言如何访问CPU内部的寄存器,比如访问R0,R1之类的
该如何定义
谢谢!



关键词: 请教     语言     如何     访问     内部     寄存器    

菜鸟
2008-07-30 09:37:20     打赏
2楼

恐怕只能内嵌汇编了。

但是不建议在C语言的程序中直接访问寄存器。很容易导致程序出错。


菜鸟
2008-07-30 09:39:01     打赏
3楼
我认为您只能使用C语言与汇编语言的混合编程了
asm("...");  //引号里面写成汇编语言就可以

菜鸟
2008-07-30 09:46:34     打赏
4楼

内嵌汇编 得参照 软件手册吧?!
一般 内嵌单条语句可以使用asm("");如:asm("nop");
有些MCU支持asm("");内嵌复合语句。
有些不支持。
R8C/2C 好像就不支持,所以需要
#pragma asm
.
.
.
#pragma endasm 

初学,仅供参考。


菜鸟
2008-07-30 09:58:29     打赏
5楼

 嗯,楼上写的真是全面了


菜鸟
2008-07-30 10:17:56     打赏
6楼

请试一下:
unsigned int m;
asm("MOV.W $$[FB],R0",m);


菜鸟
2008-07-30 10:42:27     打赏
7楼

 我一般自己写函数,函数如下:
由于函数的变量是由寄存器传递的,所以如果要得到原始的寄存器值,就不能使用带参数的函数。只能使用全局变量。

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
    }
}


助工
2008-07-30 11:24:11     打赏
8楼

这么多热心人啊
看来要嵌入汇编了
谢谢

菜鸟
2014-08-09 15:34:39     打赏
9楼
学习了啊,不过还想知道为什么C语言不能直接访问cpu内部寄存器?

共9条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]