A89: (C language) Macro Expansion


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

A89: (C language) Macro Expansion




Mark Leverentz writes:
 > 
 > I would like to create macros which are assembly statements, but the trick
 > is that I want to be able to change what the assembly statement is.
 > For instance, I know it is possible to do this:
 > 
 > #define MY_MACRO(x) asm("\n" x ": .byte 0\n");
 > 
 > MY_MACRO(MyByte)

With gcc you get a parsing error fo that. You should use

	MY_MACRO( "MyByte" )

However, you don't want to do that, you want to do

   #define MY_MACRO(x) asm("\n" #x ": .byte 0\n");
 
instead and then you *can* (and, in fact, must) use

	MY_MACRO( MyByte )

 > But things get more complicated.  I would like to be able to pass numbers as
 > parameters, and have them included in the string.  For example:
 > 
 > #define DECLARE_POINT(x,y) asm("\nMyRect: .long " x ", " y "\n");
 > 
 > This will work only if x and y are literal strings, f.x.
 > DECLARE_POINT("3","4")
 > 
 > Is there any way to do this without passing literal strings, f.x.
 > DECLARE_POINT(3,4) ?

Using the above construct will solve your problem. It is an ANSI C
thing therefore any ANSI C compiler will accept it. That is:

   #define DECLARE_POINT(x,y) asm("\nMyRect: .long " #x ", " #y "\n");

and you can then do

   DECLARE_POINT(13,an_other_assembly_label+3 );
 
will generate the expected

   asm( "\nMyRect: .long 13 , an_other_assembly_label+3\n" );
   
and so on.

It is based om 2 things:

ANSI C defines the # operator in macro parameter expansion, which
causes the parameter substitutrion to be surrounded by double quotes. 

ANSI C also declares that two character strings with only whitespace
between them will be concatenated into one string.

I suggest reading 

   B. W. Kernighan - D. M. Ritchie 
   "The C Programming Language",
   Second Edition. 
   ISBN 0-13-110362-8
   
Regards,

Zoltan


Follow-Ups: References: