This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to fine tune a piece of C code into macro?

I have a piece of C code,


if(u3Varaible0 > u3Variable2)
{
#ifdef DEF_SOMETHING
.
.
#else
.
.
#endif
}
else
{
.
.
.
}


The variable length of u3Varaible0 is 3 bytes. I don't want to declare it as "unsigned long"(inorder to save onchip memory and reduce execution cycles), So I have to write this piece C code into asm code look like


CLR C
MOV Au3Varaible0_L
SUBB A,u3Variable2_L
MOV Au3Varaible0_M
SUBB A,u3Variable2_M
MOV Au3Varaible0_H
SUBB A,u3Variable2_H
JC C0049
.
.
.
.
C0049:
.
.
.


I want it be a macro(inorder to reduce execution cycles).
But now comes the problem:
1.
If I write this code as a asm macro in an asm source. I just can't use this macro from a C code.

2.
If I try to write is as C macro using #define, It is impossible to use inline assembly in the macro!!

3.
#ifdef DEF_SOMETHING
will also cause an error in #define macro


Does anyone know another good way to solve this fine tune problem?

Parents
  • 1. This seems reasonable, if inconvenient, since the assembler syntax is not understood by the compiler, any more than the assembler understands C function call syntax.

    2, 3. ANSI C prohibits a preprocessor macro (#define) from generating further preprocessor directives. So a #define can indeed not expand into a "#pragma asm" or "#if defined()". (This restriction is one of the more awkward points about trying to play nice and use the standard #pragma syntax, instead of adding extension keywords or the GNU-ish __attribute(foobar).)

    The easiest way, IMO, to link C code with assembler code is to write subroutines in assembly that conform to the C calling conventions. Then add extern definitions to a header file, #include that header, and call the function as normal.

Reply
  • 1. This seems reasonable, if inconvenient, since the assembler syntax is not understood by the compiler, any more than the assembler understands C function call syntax.

    2, 3. ANSI C prohibits a preprocessor macro (#define) from generating further preprocessor directives. So a #define can indeed not expand into a "#pragma asm" or "#if defined()". (This restriction is one of the more awkward points about trying to play nice and use the standard #pragma syntax, instead of adding extension keywords or the GNU-ish __attribute(foobar).)

    The easiest way, IMO, to link C code with assembler code is to write subroutines in assembly that conform to the C calling conventions. Then add extern definitions to a header file, #include that header, and call the function as normal.

Children
No data