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.
But I just want to know how to solve this problem or avoid this error happening again
You have not shown us any problem worth solving, much less an actual error!
how to change the keil compiler to produce correct assemble language
You don't. Because it's brutally obvious that you don't know what correct or incorrect assembly code is, in this context.
My code has bug or the compiler's wrong?
So far: neither. The only thing you have demonstrated to be wrong so far is your understanding of what the job of a C compiler is.
hi: everybody,I have found the reason that the pop_value variable should be defined unsigned char type,or the compiler would produce wrong disassemble code.But I do not why?
the pop_value variable should be defined unsigned char type,or the compiler would produce wrong disassemble code.But I do not why? the previous post said" So far: neither. The only thing you have demonstrated to be wrong so far is your understanding of what the job of a C compiler is. now we can add The other thing you have demonstrated to be wrong is your understanding of C and the '51
Erik
Read this and thought it must be 1st April.
Surely this is a [really rather poor] wind-up.
I have found the reason
No, you haven't. You haven't found anything. What you have done so far is imagine things.
or the compiler would produce wrong disassemble code.
So you've been claiming all through this thread. And all that while this judgement of yours has been based on incorrect assumptions about what qualifies compiler output as correct.
I.e. you haven't found anything, and you haven't learned anything either. Which begs the question why you're even bothering to ask questions, given that you couldn't care less about the answers.