This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Passing an address to a #define in C


Hi Gus,

I need to put an specific machine code in any part of the memory. This code
is for some hardware module that can understand it. Of course, gcc will not
understand it, so I need to use .word 0xfc to create that code.

Now, I would like to create a pseudo assembler for my module, in following
way:

#define       LOAD         asm(".word 0xFC \n\t");
#define       INSTRUCTION2   asm(.word  0x4b \n\t");
#define       GOTO(label)         asm(".word " #label " \n\t");

Yes, this will not work this way. #label will stringify the input and will not produce an address.


Please do also keep in mind that .word might have different size depending on the target architecture the assembler is configured for.

void mycode(void) {

   LOAD
Label1:
   INSTRUCTION2
   GOTO(Label1)
}

It is generally possible to do use the asm() instruction for this purpose, but I'm not sure if this is the best approach.


I would possibly try to separate this code from the code generated by the compiler for the underlying CPU e.g. by putting these artificial instructions into a separate section and make this section executable by a linker script if executable permissions are required or to put this into the data segment if only read permissions are required.

The only benefit using the asm() to me is to put the data into an executable section, but the handling might be complex for your purpose since you don't use assembly mnemonics beside .word.



Hope that helps,
Andi


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]