Napisalem w Keilu C51 tak± oto funkcjê:
// deklaracja rejestru DPTR jako sfr16
sfr16 PM = 0x82;
void write_row(void) small { char cntr;
DPL = wr_page_index; cntr = 8;
do { DPH = visual_page; ACC = *(char xdata*)PM; ACC = ~ACC; DPH = 0x80;
*(char xdata*)PM = ACC; DPL++;
DPH = visual_page; ACC = *(char xdata*)PM; ACC = ~ACC; DPH = 0x80;
*(char xdata*)PM = ACC; DPL++;
}while(--cntr);
wr_page_index = DPL; }
wszystko jest niby ok ale kod wynikowy w asm wygl±da nastêpuj±co:
; FUNCTION write_row (BEGIN) ; SOURCE LINE # 200 ; SOURCE LINE # 208
0000 850082 E MOV DPL,wr_page_index ; SOURCE LINE # 209 ;---- Variable 'cntr' assigned to Register 'R7' ----
0003 7F08 MOV R7,#08H
0005 ?C0007: ; SOURCE LINE # 212 ; SOURCE LINE # 219
0005 850083 E MOV DPH,visual_page ; SOURCE LINE # 220
0008 AD82 MOV R5,DPL
000A AC83 MOV R4,DPH
000C E0 MOVX A,@DPTR ; SOURCE LINE # 221
000D F4 CPL A ; SOURCE LINE # 222
000E 758380 MOV DPH,#080H C51 COMPILER V7.00 TMR
10/05/2003 13:57:44 PAGE 11
; SOURCE LINE # 223
0011 F0 MOVX @DPTR,A ; SOURCE LINE # 224
0012 0582 INC DPL ; SOURCE LINE # 232
0014 850083 E MOV DPH,visual_page ; SOURCE LINE # 233
0017 AD82 MOV R5,DPL
0019 E0 MOVX A,@DPTR ; SOURCE LINE # 234
001A F4 CPL A ; SOURCE LINE # 235
001B 758380 MOV DPH,#080H ; SOURCE LINE # 236
001E F0 MOVX @DPTR,A ; SOURCE LINE # 237
001F 0582 INC DPL ; SOURCE LINE # 240
0021 DFE2 DJNZ R7,?C0007 ; SOURCE LINE # 248
0023 858200 E MOV wr_page_index,DPL ; SOURCE LINE # 249
0026 22 RET ; FUNCTION write_row (END)
w kodzie tym widaæ, ¿e wszystko jest jak nale¿y ale kompilator nie wiadomo po co dok³ada instrukcje
0008 AD82 MOV R5,DPL
000A AC83 MOV R4,DPH
mo¿e kto¶ sie spotka³ z czym¶ takim i znalaz³ rozwiazanie ?
Pzdr megaraptor