I am using assembly language routines called from C code. Within the assembly routines, is it necessary to save the registers used? Ex: MY_ASM_ROUTINE: PUSH ACC ; necessary ? CLR A ; overwrite ACC POP ACC RET main(){ MY_ASM_ROUTINE(); } Or does the C compiler assume that registers can be overwritten by calls to routines? I couldn't find the answer in the manuals. Thanks in advance Jim Burke
>1. There is no difference between a C function and an assembly function. >5. The regfile is used to perform >global register optimizations. >Basically, a bipmap of the registers >used in each function is built up and >used by the C compiler to optimize >saving and restoring registers. I think you forget about $REGUSE directive. Sentence (1.) is not true. Main difference between C and Assembler functions is that C compiler don't know anything about using registers in assembler function. So, to force compiler apply 'global optimisation' under assembler functions user MUST explicitly declare used registers with $REGUSE directive. For example: --- file SWAPBYTE.C ---
#pragma SRC(SWAPBYTE.a51) #pragma asm $REGUSE _SwapByte(A, R7 ) #pragma endasm uchar SwapByte(unsigned char Byte) { ACC = Byte; #pragma asm swap a #pragma endasm return( ACC ); }
#pragma asm $REGUSE _SwapByte(A, R7 ) #pragma endasm