| ||||||||
Technical Support Support Resources Product Information | C51: IN-LINE ASM GIVES COMPILER WARNINGSInformation in this article applies to:
QUESTIONI have a problem with following in-line assembly code that I created from an old, existing assembly function:
unsigned char PutChar_I2C(unsigned char ch) {
#pragma asm
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return value 1
CLR MCO
#pragma endasm
}
This code generated these warnings: warning C280: 'ch': unreferenced local variable warning C173: missing return-expression The compiler generates this warning despite the fact I used the variable 'ch' (passed in R7). Also, why is there a warning for a missing return-expression since I set the return value in R7? ANSWERThere are two solutions to your problem. Since the complete function is just assembly, you should leave it in a separate assembler module and just add the proper segment naming conventions. Then you may call the function from C as shown below: Assembler Module:
?PR?_PutChar_I2C?FILE SEGMENT CODE
RSEG ?PR?_PutChar_I2C?FILE
PUBLIC _PutChar_I2C
_PutChar_I2C:
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return value 1
CLR MCO
RET
Function Call from C:
extern unsigned char PutChar_I2C(unsigned char ch);
void main (void) {
val = PutChar_I2C (1);
}
Another solution is to add dummy statements to the C source file as shown below:
unsigned char PutChar_I2C(unsigned char ch) {
// dummy assignment to avoid warning
// 'unreferenced local variable'
ch = ch;
#pragma asm
SETB MDE
MOV A,R7 ; get ch in ACC
.
.
.
MOV R7,#1 ; return 1
CLR MCO
#pragma endasm
// dummy return to avoid warning
// 'missing return-expression'
return (ch);
}
The C51 compiler does not generate warnings. However, carefully review the generated code for these statements, and confirm that the variable 'ch' is correctly assigned to the parameter passing register R7 for the return value. MORE INFORMATION
SEE ALSOFORUM THREADSThe following Discussion Forum threads may provide information related to this topic. Last Reviewed: Friday, July 15, 2005 | |||||||
| ||||||||