打印

如果不用嵌入汇编,CJNE 这条指令如何在C里实现

[复制链接]
2810|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zico1998|  楼主 | 2008-1-10 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我遇到的问题是:CJNE 这条指令如何在C里实现

有这样几句汇编:

             MOV A,#00H
             MOV R0,#00H
FILL_ZERO:   MOV @R0,A
             INC R0
             CJNE R0,#255,FILL_ZERO

在KEIL51下产生代码为:
    68:              MOV A,#00H 
C:0x005F    7400     MOV      A,#0x00
    69:              MOV R0,#00H 
C:0x0061    7800     MOV      R0,#0x00
    70: FILL_ZERO:   MOV @R0,A 
C:0x0063    F6       MOV      @R0,A
    71:              INC R0 
C:0x0064    08       INC      R0
    72:              CJNE R0,#255,FILL_ZERO 
    73:  
C:0x0065    B8FFFB   CJNE     R0,#0xFF,FILL_ZERO(C:0063)
一共产生5条代码。


我尝试用如下的C取代
uchar idata *i;
 i=0;
do{
    *i=0x00;
    i++;
    }while(i<255);
或者
uchar idata *i;
for(i=0;i<255;i++) *i=0;

结果生成代码都不精简,都是10条
    86:  i=0; 
C:0x0858    E4       CLR      A
C:0x0859    F8       MOV      R0,A
    87:  do{ 
    88:     *i=0x00; 
C:0x085A    E4       CLR      A
C:0x085B    F6       MOV      @R0,A
    89:     i++; 
C:0x085C    08       INC      R0
    90:     }while(i<255); 
C:0x085D    E8       MOV      A,R0
C:0x085E    C3       CLR      C
C:0x085F    94FF     SUBB     A,#0xFF
C:0x0861    40F7     JC       C:085A

或者
    91:         for(i=0;i<255;i++) *i=0;                       
C:0x0858    E4       CLR      A
C:0x0859    F8       MOV      R0,A
C:0x085A    E8       MOV      A,R0
C:0x085B    C3       CLR      C
C:0x085C    94FF     SUBB     A,#0xFF
C:0x085E    5005     JNC      C:0865
C:0x0860    E4       CLR      A
C:0x0861    F6       MOV      @R0,A
C:0x0862    08       INC      R0
C:0x0863    80F5     SJMP     C:085A
C:0x0865    ...

相关帖子

沙发
zico1998|  楼主 | 2008-1-10 18:32 | 只看该作者

究其原因

还有一种我尝试的是:
i=0; 
while(i!=255){*i=0x00;i++;} 

    86:  i=0; 
C:0x0858    E4       CLR      A
C:0x0859    F8       MOV      R0,A
    91: while(i!=255){*i=0x00;i++;} 
C:0x085A    E8       MOV      A,R0
C:0x085B    F4       CPL      A
C:0x085C    6005     JZ       C:0863
C:0x085E    E4       CLR      A
C:0x085F    F6       MOV      @R0,A
C:0x0860    08       INC      R0
C:0x0861    80F7     SJMP     C:085A

使用特权

评论回复
板凳
OneMillion| | 2008-1-10 18:52 | 只看该作者

为什么要这样用?

  好久没用KEIL 51了

使用特权

评论回复
地板
xwj| | 2008-1-10 22:47 | 只看该作者

简单使用 != 即可

{
unsigned char idata *i;
i=0;
do{
    *i=0x00;
    i++;
    }while(i!=255);
}

     3: { 
     4: unsigned char idata *i; 
     5: i=0; 
C:0x000F    E4       CLR      A
C:0x0010    F8       MOV      R0,A
     6: do{ 
     7:     *i=0x00; 
C:0x0011    E4       CLR      A
C:0x0012    F6       MOV      @R0,A
     8:     i++; 
C:0x0013    08       INC      R0
     9:     }while(i!=255); 
C:0x0014    B8FFFA   CJNE     R0,#0xFF,C:0011
    10: } 

使用特权

评论回复
5
xwj| | 2008-1-10 22:57 | 只看该作者

非要一样的话就只得用ACC了,但不建议这样做

#include <REGX52.H>
void main(void)
{
unsigned char idata *i;
ACC=0;
i=0;
do{
    *i=ACC;
    i++;
    }while(i!=255);
}

     4: { 
     5: unsigned char idata *i; 
     6: ACC=0; 
C:0x000F    E4       CLR      A
     7: i=0; 
C:0x0010    F8       MOV      R0,A
     8: do{ 
     9:     *i=ACC; 
C:0x0011    F6       MOV      @R0,A
    10:     i++; 
C:0x0012    08       INC      R0
    11:     }while(i!=255); 
C:0x0013    B8FFFB   CJNE     R0,#0xFF,C:0011
    12: } 

使用特权

评论回复
6
ayb_ice| | 2008-1-11 11:53 | 只看该作者

if(x != xxx){}

使用特权

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

本版积分规则

4

主题

36

帖子

0

粉丝