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

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

Re: [avr-gcc-list] in-line assembler


From: Wouter van Gulik
Subject: Re: [avr-gcc-list] in-line assembler
Date: Tue, 11 Aug 2009 13:10:32 +0200
User-agent: Thunderbird 2.0.0.22 (Windows/20090605)

Oke I had some more coffee:

uint8_t get_ram_byte(uint16_t ram_address)
{
    uint8_t    byte;

    asm  ("ld  %[reg], %a[adr]"  "\n\t"
          "st %a[adr], %[reg]"  "\n\t"
    : [reg] "=&r" (byte)
    : [adr] "e"   (ram_address));
    return byte;
}

I only compiled, not assembled...
This compiles and assembles. Note the extra 'a' in front of adr and the st instead of sts

HTH,

Wouter


Wouter van Gulik schreef:
Hi,

I don't know what you intended to do but I guess this is more like it (read the value and write it back):
I personally prefer the %[] construction.

uint8_t get_ram_byte(uint16_t ram_address)
{
    uint8_t    byte;

    asm  ("ld  %[reg] , %[adr]"  "\n\t"
          "sts %[adr] , %[reg]"  "\n\t"
    : [reg] "=&r" (byte)
    : [adr] "e"   (ram_address));
    return byte;
}

You're construction of "sts %0, __tmp_reg__" is not correct. GCC is trying to feed sts r24 as first argument, which is invalid. You are feeding him the uninitialized variable 'byte'. Which is also allocate to R24.

HTH,

Wouter


Robert von Knobloch schreef:
Hello,
I've been trying to decipher the intricacies of in-line assembler (using
the Inline Assembler Cookbook as my guide).

I have a very simple application that I cannot seem to realise.

I want a C function that will return the contents of the RAM address
that I give it as argument.

My assembler-based function looks like this:

file is hex.c
=====
uint8_t get_ram_byte(uint16_t ram_address)
{
    uint8_t    byte;

    asm  ("ld __tmp_reg__, %a1"    "\n\t"
    "sts %0, __tmp_reg__"    "\n\t"
    : "=&r" (byte) : "e" (ram_address));
    return byte;
}

and is called from

            rambyte = get_ram_byte(i );
            u_hex8out(rambyte);         // Print byte as 8-bit hex.

Trying to compile this results in "~/Monitor/hex.c:5: undefined
reference to `r24' "
If I comment out the line "sts %0, __tmp_reg__"    "\n\t" then it
compiles and I see that the parameter is passed in R24,25, copied to
R30,31[Z] and the value is read into R0 [__tmp_reg__].
I cannot see what is wrong with the sts command or why R24 is mentioned.

Can anybody help me ?

Many thanks,

Robert von Knobloch.



_______________________________________________
AVR-GCC-list mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list



_______________________________________________
AVR-GCC-list mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/avr-gcc-list





reply via email to

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