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.
I can not find the error happened.
Well, then how you do know there is an error to be found?
so I also compile this C code in another project.
No, you didn't. That's not the same code. For starters, 'item' has a different data type than 'pop_value'.
The important thing is that the compiler make a wrong logical judge.
No. The important thing is for you to understand that you're wrong about what the compiler is required to do, and what it's not. It's not required to compile that conditional instruction into any code at all. And statements like
item=item;
don't do anything (unless 'item' is volatile), so they can be removed entirely.
hi: Thanks your advice. But I just want to know how to solve this problem or avoid this error happening again.how to change the keil compiler to produce correct assemble language .I found the keil compiler produce wrong code sometime .It is associate with what problem.My code has bug or the compiler's wrong?
Start by finding an example where the compiler produces the wrong code - and where you haven't made too many assumptions about what the compiler should do when you give it meaningless code to chew on.
View all questions in Keil forum