我遇到的问题是: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 ... |