打印

关于在c中用ACC寄存器问题,出错?

[复制链接]
3477|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
c555|  楼主 | 2010-7-16 17:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2010-7-16 17:21 | 只看该作者
本帖最后由 ayb_ice 于 2010-7-17 15:29 编辑

这样用可能死悄悄的

这里可能for ( i=8; i>0; i-- ) 会用到ACC,这样就会覆盖下面的ACC值

C里面一般不要去操作寄存器

使用特权

评论回复
板凳
efen| | 2010-7-16 17:27 | 只看该作者
LS利害,学习了

使用特权

评论回复
地板
350304709| | 2010-7-16 17:42 | 只看该作者
恩,是的

使用特权

评论回复
5
李冬发| | 2010-7-16 18:15 | 只看该作者
用了C,除非你特牛,否则动到寄存器,死得难看。

使用特权

评论回复
6
hgjinwei| | 2010-7-16 20:43 | 只看该作者
啥都别说了,上代码一看就明白了。
    32: void rmove(void) 
    33: {
    34:         int i;
    35:    for ( i=8; i>0; i-- )  
C:0x008F    7F08     MOV      R7,#keyb(0x08)
C:0x0091    7E00     MOV      R6,#0x00
    36:        {
    37:               ACC_7=DIO;
C:0x0093    A297     MOV      C,DIO(0x90.7)
C:0x0095    92E7     MOV      ACC_7(0xE0.7),C
    38:               SCLK = 0;
C:0x0097    C296     CLR      SCLK(0x90.6)
    39:               ACC=ACC>>=1;
C:0x0099    FD       MOV      R5,A
C:0x009A    7C01     MOV      R4,#0x01
C:0x009C    7801     MOV      R0,#0x01
C:0x009E    08       INC      R0
C:0x009F    8002     SJMP     C:00A3
C:0x00A1    C3       CLR      C
C:0x00A2    13       RRC      A
C:0x00A3    D8FC     DJNZ     R0,C:00A1
    40:               SCLK = 1;
C:0x00A5    D296     SETB     SCLK(0x90.6)
    41:                   }
    42:  
C:0x00A7    EF       MOV      A,R7
C:0x00A8    1F       DEC      R7
C:0x00A9    7001     JNZ      C:00AC
C:0x00AB    1E       DEC      R6
C:0x00AC    EF       MOV      A,R7
C:0x00AD    4E       ORL      A,R6
C:0x00AE    70E3     JNZ      C:0093
    43: }
    44:  
C:0x00B0    22       RET      

使用特权

评论回复
7
hgjinwei| | 2010-7-16 20:49 | 只看该作者
而这样就行
    32: void rmove(void) 
    33: {
    34:         unsigned char i;
    35:    for ( i=8; i>0; i-- )  
C:0x008F    7F08     MOV      R7,#keyb(0x08)
    36:        {
    37:               ACC_7=DIO;
C:0x0091    A297     MOV      C,DIO(0x90.7)
C:0x0093    92E7     MOV      ACC_7(0xE0.7),C
    38:               SCLK = 0;
C:0x0095    C296     CLR      SCLK(0x90.6)
    39:               ACC=ACC>>=1;
C:0x0097    FE       MOV      R6,A
C:0x0098    7D01     MOV      R5,#0x01
C:0x009A    7801     MOV      R0,#0x01
C:0x009C    08       INC      R0
C:0x009D    8002     SJMP     C:00A1
C:0x009F    C3       CLR      C
C:0x00A0    13       RRC      A
C:0x00A1    D8FC     DJNZ     R0,C:009F
    40:               SCLK = 1;
C:0x00A3    D296     SETB     SCLK(0x90.6)
    41:                   }
    42:  
C:0x00A5    DFEA     DJNZ     R7,C:0091
    43: }
    44:  
C:0x00A7    22       RET      

使用特权

评论回复
8
hgjinwei| | 2010-7-16 20:51 | 只看该作者
要在C语言中直接访问工作寄存器(R0~R7,A,B等等),你就得考虑后果。
和编译器抢资源,这不是自找苦吃吗?

使用特权

评论回复
9
xlsbz| | 2010-7-16 21:44 | 只看该作者
LZ 你是做项目呢?还是自己玩呢?

玩的话,我佩服  看样是厉害人物 即便现在不是。

但是做项目 用ACC 就夸张了啊  要不得!

使用特权

评论回复
10
Mindor| | 2010-7-17 08:17 | 只看该作者
我有次用I2C用了ACC,也被囧到了。。。
结果好像改成for(i = 0; i < 8; i++)就没事了。。。- -

使用特权

评论回复
11
tuzheng| | 2010-7-17 15:20 | 只看该作者
没听说过用C还要用ACC的

使用特权

评论回复
12
xuyiyi| | 2010-7-17 15:28 | 只看该作者
要在C语言中直接访问工作寄存器(R0~R7,A,B等等),你就得考虑后果。
和编译器抢资源,这不是自找苦吃吗?
hgjinwei 发表于 2010-7-16 20:51


同意LS观点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

264

主题

556

帖子

3

粉丝