From: Borut R. <bor...@si...> - 2007-11-06 19:47:02
|
Alan Carvalho de Assis wrote: > Hi David > > 2007/11/6, David Lucena <yak...@ya...>: > >> --- Alan Carvalho de Assis <ac...@gm...> escribió: >> >> >>> Hi, >>> I verify that SDCC can't compile macros if it have more than one >>> assembly line wrapped by _asm/_endasm. >>> >>> In example: >>> >>> #define SAVE_TASK_CTX(stack_low, stack_high) \ >>> >>> { \ >>> >>> /* Disable global interrupt. */ \ >>> >>> _asm \ >>> >>> bcf INTCON, 6, 0 \ >>> >>> movff STATUS, PREINC1 \ >>> >>> movff WREG, PREINC1 \ >>> >>> _endasm \ >>> >>> /* Store the necessary registers to the stack. */ \ >>> ... >>> } >>> >> Have you noticed that the _endasm avobe has not ';'. Can you verify that is that way in your code? >> >> > > Before wrap each line I just placed the ';' but the generated code > (.asm) was wrong: > > bcf INTCON, 6, 0 movff STATUS, PREINC1 movff WREG, PREINC1 > movff BSR, PREINC1 movff FSR2L, PREINC1 movff FSR2H, PREINC1 movff > FSR0L, PREINC1 movff FSR0H, PREINC1 movff TBLPTRU, PREINC1 movff > TBLPTRH, PREINC1 movff TBLPTRL, PREINC1 movff TABLAT, PREINC1 movff > PRODH, PREINC1 movff PRODL, PREINC1 > movlw 0x20 +1 clrf FSR0L, 0 clrf FSR0H, 0 > > As you can see the compile placed all instruction wrapped by > _asm/_endasm into a single line. > > The C preprocessor coverts all the '\' delimited lines into a single line (this is the correct behavior) and pass it to the C compiler. The C compiler just pass everything between __asm and __endasm; directly to the assembler. So if the assembler doesn't know how to assemble multiple instructions in a single line, you have a problem. An it seems that gpasm is such an assembler... I think that your workaround to put each asm line in a sparate __asm/__endasm; block is correct. Borut |