我使用的是 Keil uVision3,真是让人又爱、让人又气!时不时遇到一些莫名其妙的问题。
这不,今天又遇到一次。 本来就下面一句:
Write_word(0,4,169+TIANGAN);
鼠标指在“TIANGAN”上,显示=9,加上169(0xa9)应该等于0xb2。可结果一看却是0xae
下面是编译器给出的对应的汇编:
//--------------------------------------------------------------------------
58: }
59: Write_word(0,4,169+TIANGAN);
C:0x2966 E51D MOV A,DIZHI(0x1D) //这一句应该汇编成“MOV A,TIANGAN(0x1C), DIZHI 是下一个地址(0x1D)的内容,内容是0x05,加上169=0xae
C:0x2968 24A9 ADD A,#0xA9
C:0x296A FB MOV R3,A
C:0x296B 7D04 MOV R5,#0x04
C:0x296D E4 CLR A
C:0x296E FF MOV R7,A
C:0x296F 022B2C LJMP Write_word(C:2B2C)
//**************************************************
无奈改成这样试一试:
结果仍然是错的:
62: j=TIANGAN+169;
63: Write_word(0,4,j);
汇编的结果如下:
62: j=TIANGAN+169;
C:0x2966 E51D MOV A,DIZHI(0x1D) //这一句应该汇编成“MOV A,TIANGAN(0x1C), DIZHI 是下一个地址(0x1D)的内容,内容是0x05
C:0x2968 24A9 ADD A,#0xA9
C:0x296A F525 MOV 0x25,A
63: Write_word(0,4,j);
C:0x296C FB MOV R3,A
C:0x296D 7D04 MOV R5,#0x04
C:0x296F E4 CLR A
C:0x2970 FF MOV R7,A
C:0x2971 022B2E LJMP Write_word(C:2B2E)
//**************************************************
最后改成这样,终于正确了。
59 uu=&TIANGAN;
60 j=*uu+169;
61 Write_word(0,4,j);
上面三句汇编的结果:
59: uu=&TIANGAN;
C:0x2966 781C MOV R0,#TIANGAN(0x1C)
60: j=*uu+169;
C:0x2968 E6 MOV A,@R0
C:0x2969 24A9 ADD A,#0xA9
C:0x296B F525 MOV 0x25,A
61: Write_word(0,4,j);
C:0x296D FB MOV R3,A
C:0x296E 7D04 MOV R5,#0x04
C:0x2970 E4 CLR A
C:0x2971 FF MOV R7,A
C:0x2972 022B2F LJMP Write_word(C:2B2F)
不知道各位高手遇到过这种情况没有?如遇到过又是怎样处理的?
[此贴子已经被作者于2013-4-15 21:07:15编辑过]
|