avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] inline assembler problem


From: Michael Jochum
Subject: [avr-gcc-list] inline assembler problem
Date: 16 Aug 2001 23:48:39 +0200

hi all!


i am writing a crc function and cant get the inline asm code to work.
the pure c-code is working. 
as you can see in crc.s the cpc instruction gets the wrong parameter.
what is the problem with this code?

i use:
  gcc version 3.0.1 20010806 (prerelease)
  binutils version version 2.11.90 20010814
  avr-libc-20010717

and cmd is:
  avr-gcc -O3 -mmcu=at90s4433 -c crc.c -S -o crc.s

tia,
michael.

--- crc.asm ---
#include <io.h>                 

static unsigned char crchi;
static unsigned char crclo;

void crcbit(unsigned char bit){
#if 1
      asm volatile(
              "clc"                             "\n\t"
              "ror %0"                          "\n\t"
              "ror %1"                          "\n\t"
              "cpc %2,__zero_reg__"             "\n\t"
              "breq crc_skip_op"                "\n\t"
              "push r24"                        "\n\t"
              "ldi r24,0x84"                    "\n\t"
              "eor %0,r24"                      "\n\t"
              "ldi r24,0x08"                    "\n\t"
              "eor %1,r24"                      "\n\t"
              "pop r24"                         "\n\t"
              "crc_skip_op:"                    "\n\t"
              : "=r" (crchi), "=r" (crclo), "=&r" (bit) 
              :  "0" (crchi), "1" (crclo)
              : "0", "1"
              );
#else
 unsigned char tmp = crclo & 1; //rotate the 16 bits to the right
 crclo = crclo >> 1;
 crclo |= (crchi & 1) << 7;
 crchi = crchi >> 1;

 if (((tmp & 0x01)^bit) ==0x01){
   crchi = crchi^0x84;
   crclo = crclo^0x08;
 } 
#endif
}

main() {
  crclo=crchi=0xff;
  for(;;) {
    crcbit(1);
    crcbit(0);
  }
}


--- crc.s ---
        .file   "crc.c"
        .arch at90s4433
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
_PC_ = 2
        .text
.global crcbit
        .type   crcbit,@function
crcbit:
/* prologue: frame size=0 */
/* prologue end (size=0) */
        lds r19,crchi
        lds r18,crclo
        mov r20,r19
        mov r22,r18
/* #APP */
        clc
        ror r20
        ror r22
        cpc r18,__zero_reg__     <<<< problem
        breq crc_skip_op
        push r24
        ldi r24,0x84
        eor r20,r24
        ldi r24,0x08
        eor r22,r24
        pop r24
        crc_skip_op:
        
/* #NOAPP */
        mov r21,r20
        mov r18,r22
        sts crchi,r21
        sts crclo,r18
/* epilogue: frame size=0 */
        ret
/* epilogue end (size=1) */
/* function crcbit size 39 (38) */
.Lfe1:
        .size   crcbit,.Lfe1-crcbit
.global main
        .type   main,@function
main:
/* prologue: frame size=0 */
        ldi r28,lo8(__stack - 0)
        ldi r29,hi8(__stack - 0)
        out __SP_H__,r29
        out __SP_L__,r28
/* prologue end (size=4) */
        ldi r18,lo8(-1)
        sts crchi,r18
        sts crclo,r18
.L3:
        ldi r24,lo8(1)
        rcall crcbit
        ldi r24,lo8(0)
        rcall crcbit
        rjmp .L3
/* epilogue: frame size=0 */
__stop_progIi__:
        rjmp __stop_progIi__
/* epilogue end (size=1) */
/* function main size 15 (10) */
.Lfe2:
        .size   main,.Lfe2-main
        .lcomm crchi,1
        .lcomm crclo,1
/* File crc.c: code   54 = 0x0036 (  48), prologues   4, epilogues   2
*/





reply via email to

[Prev in Thread] Current Thread [Next in Thread]