My keil is the latest version C51V961.
The code is very simple:
#include "reg52.h" #include "stdio.h" #include "intrins.h" void uart_init() { SCON = 0x52; TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; } void main() { unsigned int a=17; // note: the name "a" caused the bug unsigned int b; uart_init(); for(b=2;b<=a-1;b++) { if(a%b==0) break; } if(b<a) printf("%d is not a prime number",a); else printf("%d is a prime number",a); while(1); }
The steps to repeat the bug:
1. create a at89s52 project.
2. copy and paste the above code to the main.c file of the project.
3. compile the project, and click the "start/stop debug session" button to launch the debug session, then click the "step over" button, watch the value of local variable "a" and "b", everything is OK.
4. stop the debug session.
5. click the "start/stop debug session" button again, then click the "step over" button, watch the value of local variable "a" and "b", then the values change as unexpected.
Conclusion:1. When the name of the local variable is “a”, only the result of the first compilation is correct. The second and subsequent compilation results are incorrect.2. If I move variables "a" and "b" outside the main() function to become global variables, then everything will OK and there will be no more bugs.
Please observe the GIF animation:
(P.S. Please "save as" this gif if it is small in the webpage)
And the project I used:
test2.zip
Thank you for your reply.
I'm not sure if I understand correctly: for the reserved words in the link you provided, neither assembly nor C51 program can be used as variables, and even lowercase letters cannot be used. For example, 'A' is the reserved symbol for the Ax51 assembler, so the programmer can not use 'A' or 'a' as a variable name, even in C51 program.
Does my understanding is correct?
Regards.
It was just a guess.
You know that single-letter variable names are poor practice anyhow?