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?
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.