我使用的是 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編輯過]
|