This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Compiler generates incorrect code for simplest program.

Can anyone figure out why the below program does not increment the variable 'i'? The C-program shifts i to the left one bit per loop but the generated code (asm program) doesn't change the 'i' variable (constant 0)!

C51 COMPILER V8.02   MAIN                                                                  11/27/2006 17:21:15 PAGE 1


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c OPTIMIZE(0,SPEED) BROWSE DEBUG OBJECTEXTEND CODE

line level    source

   1
   2          #include <REG7C646.H>
   3
   4          void main()
   5          {
   6   1              unsigned char i;
   7   1
   8   1              while(1)
   9   1              {
  10   2                      for(i = 0; i <= 0x80; i <<= 1)
  11   2                      {
  12   3                              P1 = i;
  13   3                      }
  14   2              }
  15   1      }
C51 COMPILER V8.02   MAIN                                                                  11/27/2006 17:21:15 PAGE 2

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION main (BEGIN)
                                           ; SOURCE LINE # 4
                                           ; SOURCE LINE # 5
0000         ?C0001:
                                           ; SOURCE LINE # 8
                                           ; SOURCE LINE # 9
                                           ; SOURCE LINE # 10
0000 750000      R     MOV     i,#00H
0003         ?C0003:
0003 E500        R     MOV     A,i
0005 D3                SETB    C
0006 9480              SUBB    A,#080H
0008 50F6              JNC     ?C0001
                                           ; SOURCE LINE # 11
                                           ; SOURCE LINE # 12
000A 850090      R     MOV     P1,i
                                           ; SOURCE LINE # 13
000D         ?C0005:
000D E500        R     MOV     A,i
000F 25E0              ADD     A,ACC
0011 F500        R     MOV     i,A
0013 80EE              SJMP    ?C0003
0015         ?C0004:
                                           ; SOURCE LINE # 14
0015 80E9              SJMP    ?C0001
0017         ?C0002:
                                           ; SOURCE LINE # 15
0017         ?C0006:
0017 22                RET
             ; FUNCTION main (END)



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =     24    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

0