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
I means that the debug is wrong. You can see the common I add there, it should not be that: But, when Debug it, it like like this in debug window:
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
What linker errors did you receive? Jon
All options are deault. BTW, my uv2 is the newest one, 6.21
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).
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
Thanks a lot. I add c51s.lib into my test project, and it seems everything is OK.