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.