[Bug c/17098] New: Calling an absolute address fails on AVRs smaller than 16kB Flash

danni at specs dot de gcc-bugzilla@gcc.gnu.org
Thu Aug 19 12:35:00 GMT 2004


The cast of a number to a function: 

((void(*)(void))0)();

works right for the ATMega16 and bigger, but wrong for all smaller AVRs, e.g.
ATMega8.

Listing ATMega16:

0000008e <main>:
int main( void )
{
  8e:   cf e5           ldi     r28, 0x5F       ; 95
  90:   d4 e0           ldi     r29, 0x04       ; 4
  92:   de bf           out     0x3e, r29       ; 62
  94:   cd bf           out     0x3d, r28       ; 61
  for(;;){
    ((void(*)(void))0)();
  96:   0e 94 00 00     call    0x0
  9a:   fd cf           rjmp    .-6             ; 0x96

Listing ATMega8:

0000005c <main>:
int main( void )
{
  5c:   cf e5           ldi     r28, 0x5F       ; 95
  5e:   d4 e0           ldi     r29, 0x04       ; 4
  60:   de bf           out     0x3e, r29       ; 62
  62:   cd bf           out     0x3d, r28       ; 61
  for(;;){
    ((void(*)(void))0)();
  64:   fb df           rcall   .-10            ; 0x5c |<--- must be 0x00 !
  66:   fe cf           rjmp    .-4             ; 0x64


Mr. Jörg Wunsch assumed, there is a fault in the assembler and thus the rcall
and rjmp instructions are wrong for absolute destignation addresses.
But the jmp and call instructions are correct for absolute destignation addresses.


Beside this, I have detected a second fault in the assembler:

The ATmega8 support jmp and call like the ATMega16. But on using jmp and call
with inline assembler it was reported as:

Error: illegal opcode jmp for mcu atmega8


My GCC:

Reading specs from C:\AVR\WINAVR\BIN\..\lib\gcc-lib\avr\3.3.2\specs
Configured with: ../gcc-3.3.2/configure --prefix=e:/avrdev/install --host=mingw3
2 --build=mingw32 --target=avr --enable-languages=c,c++
Thread model: single
gcc version 3.3.2


Best regards,

Peter Dannegger

-- 
           Summary: Calling an absolute address fails on AVRs smaller than
                    16kB Flash
           Product: gcc
           Version: 3.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: danni at specs dot de
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17098



More information about the Gcc-bugs mailing list