We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
hi: I have a code below:
char pop_value = 0X80; if(pop_value == 0X80) { pop_value = pop_value;//point 1 } pop_value = pop_value;//point 2
I would have thought the code would jump to point 1 after logical judge, but the simulating result exceed my expectations that the code jumped to point 2. I watch the Disassembly code :
82: pop_value = 0X80; C:0x0A68 7853 MOV R0,#pop_value(0x53) C:0x0A6A 7680 MOV @R0,#P0(0x80) 83: if(pop_value == 0X80) C:0x0A6C E6 MOV A,@R0 C:0x0A6D FF MOV R7,A C:0x0A6E FD MOV R5,A C:0x0A6F 33 RLC A C:0x0A70 95E0 SUBB A,ACC(0xE0) C:0x0A72 FC MOV R4,A C:0x0A73 ED MOV A,R5 C:0x0A74 6480 XRL A,#P0(0x80) C:0x0A76 4C ORL A,R4 C:0x0A77 7002 JNZ C:0A7B 84: { 85: pop_value = pop_value; 86: C:0x0A79 A607 MOV @R0,0x07 87: } C:0x0A7B 22 RET PUTCHAR:
I can not find the error happened.so I also compile this C code in another project. the code can jump to point 1 after logical judge ,nor jump to point 2.I watch the the Disassembly code at once:
61: item = 0X80; C:0x0A94 752400 MOV 0x24,#malloc_mempool(0x00) C:0x0A97 752580 MOV 0x25,#P0(0x80) 62: if( item== 0x80) C:0x0A9A E525 MOV A,0x25 C:0x0A9C 6480 XRL A,#P0(0x80) C:0x0A9E 4524 ORL A,0x24 C:0x0AA0 7006 JNZ C:0AA8 63: { 64: item =item; C:0x0AA2 852424 MOV 0x24,0x24 C:0x0AA5 852525 MOV 0x25,0x25 65: }
my keiC51 version is V8.16. I don't know why the same C code has different assemble code in different project. The important thing is that the compiler make a wrong logical judge.
"how to change the keil compiler to produce correct assemble language."
To overcome the situation you consider to be an error, I would suggest that you find a compiler that is guaranteed to produce totally non-optimised code.
Does setting the optimisation to minimum in C51 achieve that?
But do note that no 'C' compiler is required to give a 1:1 direct, in-sequence relationship between source code and executable - that's a fundamental principle of HLLs! If you want that, then you have to write in Assembler!
I don't think it does - But may be wrong.
Many years ago, when I first looked into C compilers, the one-to-one relationship appeared to be quite common and any form of optimization was an extra.
You may be right:
Level-0 (ie, minimum) optimisations are:
"Constant Folding: The compiler performs calculations that reduce expressions to numeric constants, where possible. This includes calculations of run-time addresses.
"Simple Access Optimizing: The compiler optimizes access of internal data and bit addresses in the 8051 system.
"Jump Optimizing: The compiler always extends jumps to the final target. Jumps to jumps are eliminated."
Level-1 optimisations are:
"Dead Code Elimination: Unused code fragments and artifacts are eliminated.
"Jump Negation: Conditional jumps are closely examined to see if they can be streamlined or eliminated by the inversion of the test logic."
http://www.keil.com/support/man/docs/c51/c51_optimize.htm