Yahoo Groups archive

AVR-Chat

Index last updated: 2026-04-28 22:41 UTC

Message

Re: [AVR-Chat] GCC on M32, WIERD happenings.

2009-03-12 by BobGardner@aol.com

Want me to compile it on the imagecraft compiler so you have a 2nd listing to look at?

-----Original Message-----
From: David VanHorn <microbrix@gmail.com>
To: AVR-Chat@yahoogroups.com
Sent: Wed, 11 Mar 2009 10:28 am
Subject: [AVR-Chat] GCC on M32, WIERD happenings.



I've asked about this over on the AVR-GCC list, but I thought it
wouldn't hurt to ask here too.

What's happening is that the compiled code isn't producing sane ASM.
This happens intermittently, and I haven't been able to pin down what
the dependency is.  It appears that if I change the C code enough, it
will go away for a while.  If I recompile a given file, I always get
the same result.

I have the .S file, but I don't know how to interpret it.

I carved up the problem statement even further, and moved the
declarations so all the vars are in ram so I can watch them easily.

 A = Raw_Data[0][Raw_Data_Index];         //  Gives the expected result.
 Bin = (A / Data_Divisor);                         // Gives nonsense,
AND trashes data in ram!

Data_Divisor is a constant, = 16.
I am getting "9" in Bin, even when A is zero.

Here's the asm output.  The first line is what I'd expect.

1072:      A = Raw_Data[0][Raw_Data_Index];         // Get the old data
+00000337:   91C00076    LDS       R28,0x0076     Load direct from data space
+00000339:   91D00077    LDS       R29,0x0077     Load direct from data space

The second one starts out normally, but then this call to 0x622, which
is hosing everything.

1073:      Bin = (A / Data_Divisor);          // Find the bin for the
old raw data
+0000033B:   01FE        MOVW      R30,R28        Copy register pair
+0000033C:   5FE2        SUBI      R30,0xF2       Subtract immediate
+0000033D:   4FFE        SBCI      R31,0xFE       Subtract immediate with carry
+0000033E:   8180        LDD       R24,Z+0        Load indirect with
displacement
+0000033F:   E090        LDI       R25,0x00       Load immediate
+00000340:   E06F        LDI       R22,0x0F       Load immediate
+00000341:   E070        LDI       R23,0x00       Load immediate
+00000342:   940E0622    CALL      0x00000622     Call subroutine
+00000344:   01DB        MOVW      R26,R22        Copy register pair

Here's where it calls to, +00000622 below.  Interestingly, the code
just walks right off the end if you get past the 
RET in 650, it does a
few things, then wanders off into space.


607:          lcd_command(dispAttr);                  /*
display/cursor control       */
+0000061D:   2F81        MOV       R24,R17        Copy register
+0000061E:   940E057F    CALL      0x0000057F     Call subroutine
609:      }/* lcd_init */
+00000620:   911F        POP       R17            Pop register from stack
+00000621:   9508        RET                      Subroutine return
609:      }/* lcd_init */
+00000622:   1BAA        SUB       R26,R26        Subtract without carry
+00000623:   1BBB        SUB       R27,R27        Subtract without carry
+00000624:   E151        LDI       R21,0x11       Load immediate
+00000625:   C007        RJMP      PC+0x0008      Relative jump
+00000626:   1FAA        ROL       R26            Rotate Left Through Carry
+00000627:   1FBB        ROL       R27            Rotate Left Through Carry
+00000628:   17A6        CP        R26,R22        Compare
+00000629:   07B7        CPC       R27,R23        Compare with carry
+0000062A:   F010        BRCS      PC+0x03        Branch if carry set
+0000062B:   1BA6        SUB       R26,R22        Subtract without carry
+0000062C:   0BB7        SBC       R27,R23        Subtract with carry
+0000062D:   1F88        ROL       R24            Rotate Left Through Carry
+0000062E:   1F99        ROL       R25            Rotate Left Through Carry
+0000062F:   955A        DEC       R21            Decrement
+00000630:   F7A9        BRNE      PC-0x0A        Branch if not equal
+00000631:   9580        COM       R24            One's complement
+00000632:   9590        COM       R25            One's complement
+00000633:   01BC        MOVW      R22,R24        Copy register pair
+00000634:   01CD        MOVW      R24,R26        Copy register pair
+00000635:   9508        RET                      Subroutine return
+00000636:   882A        LDD       R2,Y+18        Load indirect with
displacement
+00000637:   8839        LDD       R3,Y+17        Load indirect with
displacement
+00000638:   884
8        LDD       R4,Y+16        Load indirect with
displacement
+00000639:   845F        LDD       R5,Y+15        Load indirect with
displacement
+0000063A:   846E        LDD       R6,Y+14        Load indirect with
displacement
+0000063B:   847D        LDD       R7,Y+13        Load indirect with
displacement
+0000063C:   848C        LDD       R8,Y+12        Load indirect with
displacement
+0000063D:   849B        LDD       R9,Y+11        Load indirect with
displacement
+0000063E:   84AA        LDD       R10,Y+10       Load indirect with
displacement
+0000063F:   84B9        LDD       R11,Y+9        Load indirect with
displacement
+00000640:   84C8        LDD       R12,Y+8        Load indirect with
displacement
+00000641:   80DF        LDD       R13,Y+7        Load indirect with
displacement
+00000642:   80EE        LDD       R14,Y+6        Load indirect with
displacement
+00000643:   80FD        LDD       R15,Y+5        Load indirect with
displacement
+00000644:   810C        LDD       R16,Y+4        Load indirect with
displacement
+00000645:   811B        LDD       R17,Y+3        Load indirect with
displacement
+00000646:   81AA        LDD       R26,Y+2        Load indirect with
displacement
+00000647:   81B9        LDD       R27,Y+1        Load indirect with
displacement
+00000648:   0FCE        ADD       R28,R30        Add without carry
+00000649:   1DD1        ADC       R29,R1         Add with carry
+0000064A:   B60F        IN        R0,0x3F        In from I/O location
+0000064B:   94F8        CLI                      Global Interrupt Disable
+0000064C:   BFDE        OUT       0x3E,R29       Out to I/O location
+0000064D:   BE0F        OUT       0x3F,R0        Out to I/O location
+0000064E:   BFCD        OUT       0x3D,R28       Out to I/O location
+0000064F:   01ED        MOVW      R28,R26        Copy register pair
+00000650:   9508        RET                      Subroutine return
+00000651:   94F8        CLI                      Global Interrupt Disable
+00000652:   CFFF        RJMP      PC-0x0000      
Relative jump
+00000653:   614D        ORI       R20,0x1D       Logical OR with immediate
+00000654:   2D67        MOV       R22,R7         Copy register
+00000655:   6553        ORI       R21,0x53       Logical OR with immediate
+00000656:   736E        ANDI      R22,0x3E       Logical AND with immediate
+00000657:   726F        ANDI      R22,0x2F       Logical AND with immediate
+00000658:   3020        CPI       R18,0x00       Compare with immediate
+00000659:   302E        CPI       R18,0x0E       Compare with immediate
+0000065A:   2031        AND       R3,R1          Logical AND
+0000065B:   6400        ORI       R16,0x40       Logical OR with immediate
+0000065C:   8000        LDD       R0,Z+0         Load indirect with
displacement
+0000065D:   0064        ???                      Data or unknown opcode
+0000065E:   FFFF        ???                      Data or unknown opcode
+0000065F:   FFFF        ???                      Data or unknown opcode
+00000660:   FFFF        ???                      Data or unknown opcode
+00000661:   FFFF        ???                      Data or unknown opcode
+00000662:   FFFF        ???                      Data or unknown opcode
+00000663:   FFFF        ???                      Data or unknown opcode
+00000664:   FFFF        ???                      Data or unknown opcode
+00000665:   FFFF        ???                      Data or unknown opcode
+00000666:   FFFF        ???                      Data or unknown opcode
+00000667:   FFFF        ???                      Data or unknown opcode


-- 

"The very powerful and the very stupid have one thing in common. Instead of
altering their views to fit the facts, they alter the facts to fit their
views... which can be very uncomfortable if you happen to be one of the
facts that needs altering." Doctor Who, Face of Evil


------------------------------------

Yahoo! Groups Links

    (Yahoo! ID required)





[Non-text portions of this message have been removed]

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.