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.
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