EmbDev.net

Forum: ARM programming with GCC/GNU tools How to write ARM assembly function which is calling from C


Author: Ganesh Prasad (Company: mindtree) (ganesh923)
Posted on:

Rate this post
0 useful
not useful
Hi,

I am writing the driver for the spi. I have written the c part but for 
configuring the spi i should have the basic macro for memory mapped IO.
I am trying to write assembly code for memory mapped IO.
I have written the Arm assembly code like ...

str1copy:

LDRB r2, [r1],#1

And i am compiling by using the "arm-none-eabi".
Then i can get the object file for assembly.

Then i have written one "C" code where i am calling this assembly. That 
code is like this one.......

#include <stdio.h>
extern void str1copy(char *d, const char *s);
int main()
{ const char *srcstr = "First string - source ";
char dststr[] = "Second string - destination ";

str1copy(dststr,srcstr);
return (0);
}

And i compiled this by using the "arm-none-eabi". and i got the object 
file.

But while Linking these two obj file by using the "arm-none-eabi_ld". I 
am getting this error.

test.o: In function `main':
test.c:(.text+0x2c): undefined reference to `memcpy'
test.c:(.text+0x3c): undefined reference to `str1copy'

Can any one please help me, how can i write the assembly code to get 
proper driver.


Thanks in advance
Ganesh

Author: Peter (Guest)
Posted on:

Rate this post
0 useful
not useful
I'm quite sure that you don't need assembly for this, I guess you can do 
everything in C...

Author: Ar Lc (al2757)
Posted on:

Rate this post
0 useful
not useful
If you really want that(writing a pure assembly function) you should 
write something like a normal function and place asm("LDRB r2, 
[r1],#1"); inside the body. You might need the "naked" attribute too(you 
should look in the generated code after this and see what it was 
generated to be sure it doesn't mess up your application).

> test.c:(.text+0x2c): undefined reference to `memcpy'

  You are missing here some libraries, you need to link also liba.c and 
libm.c.

  Hope it helps!


  Lucian

P.S. Or you cand use the strcpy provided with the compiler ;-).

Author: Ar Lc (al2757)
Posted on:

Rate this post
0 useful
not useful
> liba.c and libm.c.

  Correction libc.a and libm.a

Author: Pierre (Guest)
Posted on:

Rate this post
0 useful
not useful
C compiler inserts a _ in front of all symnbols, the assembler probably 
does not.

_str1copy:

if you use a C++ compiler, get used with much more funny name mangling 
(parameters are suffixed with the name).

Your compiler might require obfuscated syntax when declaring
(if you ever wrote dll for windows, you would know __export __DLL 
__pascal __winApi are important in the declaration of each function)

Your compiler might require something close to
extern _asm_linkage_ void str1copy(char *dst, char *src)
or also, possibly
extern "C" void str1copy(char *dst, char *src)

Check the doc of your compiler.


As suggested in this thread of mails, use assembly inside C function if 
you use gnu C compiler. It looks like that:


void str1copy(char *dst, char *src)
{
      _asm_ {    \n
            mov r0, %0  \n
            mov r1, %1  \n
            ..... \n"
          : : "=r"(dst), "=r" (src): (memory) (r0) (r1)};
}

Browse the wen for similar code, and read the gnu documentation about 
the _asm_ parameters. They are hardware specific.

Author: Martin Thomas (mthomas) (Moderator)
Posted on:

Rate this post
0 useful
not useful
Ganesh Prasad wrote:
>...
> But while Linking these two obj file by using the "arm-none-eabi_ld". I
> am getting this error.
Don't use the linker directly, used the frontend (arm-none-eabi-gcc) for 
linking. Using ld directly may cause unneeded trouble.

> test.o: In function `main':
> test.c:(.text+0x2c): undefined reference to `memcpy'
As already mentioned: link with libc (and libgcc) using options -lc 
(-lgcc)

> test.c:(.text+0x3c): undefined reference to `str1copy'
Try
.global str1copy
str1copy:

> Can any one please help me, how can i write the assembly code to get
> proper driver.
>...
There might be no need to use assembly-language. The strcpy in newer 
versions of the newlib (the libc in CS G++ and other packages) includes 
a rather fast implementation for strcpy.


Pierre wrote:
>...
>if you use a C++ compiler, get used with much more funny name mangling
>(parameters are suffixed with the name).
>...
Yes, for C++, but this should not be an issue when using "pure" C and 
assembler files.

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig
Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.