I use this code:
#include <reg52.h> void main(void) { unsigned char data x8,x9,x10; while(1) { x8 = 0; x9 = 9; x10 = x8 + x9; __asm CLR A; } }
; void main(void) RSEG ?PR?main?MAIN main: USING 0 ; SOURCE LINE # 5 ; { ; SOURCE LINE # 6 ?C0001: ; unsigned char data x8,x9,x10; ; while(1) ; SOURCE LINE # 8 ; { ; SOURCE LINE # 9 ; x8 = 0; ; SOURCE LINE # 10 ;---- Variable 'x8?040' assigned to Register 'R7' ---- CLR A MOV R7,A ; x9 = 9; ; SOURCE LINE # 11 ;---- Variable 'x9?041' assigned to Register 'R6' ---- MOV R6,#09H ; x10 = x8 + x9; ; SOURCE LINE # 12 ADD A,R6 MOV x10?042,A ; __asm CLR A; CLR A; ; } ; SOURCE LINE # 14 SJMP ?C0001 RET ; END OF main END
C_STARTUP: C:0x0000 020003 LJMP STARTUP1(C:0003) STARTUP1: C:0x0003 787F MOV R0,#0x7F C:0x0005 E4 CLR A IDATALOOP: C:0x0006 F6 MOV @R0,A C:0x0007 D8FD DJNZ R0,IDATALOOP(C:0006) C:0x0009 758108 MOV SP(0x81),#0x08 C:0x000C 020000 LJMP C_STARTUP(C:0000)========>You see here!!! MAIN: C:0x000F E4 CLR A C:0x0010 FF MOV R7,A C:0x0011 7E09 MOV R6,#0x09 C:0x0013 2E ADD A,R6 C:0x0014 F508 MOV 0x08,A C:0x0016 E4 CLR A C:0x0017 80F6 SJMP MAIN(C:000F) C:0x0019 22 RET
Thanks a lot. I add c51s.lib into my test project, and it seems everything is OK.
I am so sorry! I forgot to add c51s.lib to my project. Now, my test project includes main.c, startup.a51 and c51s.lib, right click the file main.c and select two options, then build it, then debug it, and everything seems is OK.
I am so sorry! I forget to add c51s.lib to my project though I add startup.a51. Now, my test project includes main.c, startup.a51 and c51s.lib, right click the file main.c and select the two options, then build it, then debug it, it seems everything is OK!
My brother's nickname is 1212, so I call myself 1122, it is simple.
Ahhhh. This warning indicates what the problem is. It is usually NOT SAFE to ignore linker errors or warnings. The problem is that you have no C modules in your program. Since you use the SRC directive to get an assembler module (from a C module) the program is really an assembler program. In such a case, you must manually include the correct C library to get the startup and initialization code routines. Refer to the following knowledgebase article for details on how to do that. http://www.keil.com/support/docs/1646.htm Larger programs with a few inline assembler modules will not exhibit this problem since there is likely to be at least one C module. Jon
P.S. What does the author name of 11 22 represent?
My first guess is that as far as the linker is concerned, you are generating a pure assembly program. Therefore the linker is not setting the C enviroment correctly. To fix this add a dummy C file that is translated using the compiler.
Someone told me the "__asm". But, use this code
#pragma asm CLR A #pragma endasm
__asm CLR A
__asm is not mentioned in the v6.20 manual. Is this an undocumented feature?
But __asm CLR A is missing.
1. I Create a new project, then add the main.c, right click the main.c, select the "options for file main.c", enables the two options "Generate Assembler SRC File and Assemble SRC File", Build it, and I get that questions. 2.Now, I try a new method, only use #pragma src at the first line in the main.c, then debug it, and I get this result, I think this one is right:
C:0x0000 020003 LJMP C:0003 C:0x0003 787F MOV R0,#0x7F C:0x0005 E4 CLR A C:0x0006 F6 MOV @R0,A C:0x0007 D8FD DJNZ R0,C:0006 C:0x0009 758108 MOV SP(0x81),#0x08 C:0x000C 02000F LJMP main(C:000F) 5: void main(void) 6: { 7: unsigned char data x8,x9,x10; 8: while(1) 9: { 10: x8 = 0; C:0x000F E4 CLR A C:0x0010 FF MOV R7,A 11: x9 = 9; C:0x0011 7E09 MOV R6,#0x09 12: x10 = x8 + x9; 13: __asm CLR A; C:0x0013 2E ADD A,R6 C:0x0014 F508 MOV 0x08,A 14: } C:0x0016 80F7 SJMP main(C:000F)
No errors, just warrings:
Build target 'Target 1' compiling main.c... assembling main.src... linking... *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C_STARTUP MODULE: main.obj (MAIN) creating hex file from "c_asm"... "c_asm" - 0 Error(s), 1 Warning(s).
All options are deault. BTW, my uv2 is the newest one, 6.21
What linker errors did you receive? Jon
In my debug windows, it shows:
C:0x0009 75 81 08 MOV SP(0x81), #0x08 C:0x000C 02 00 0F LJMP MAIN(C:000F) C:0x000F E4 CLR A <==== MAIN
View all questions in Keil forum