Problem z Keilem

Oct 05, 2003 1 Replies

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



U¿ytkownik "megaraptor" snipped-for-privacy@gazeta.pl napisa³ w wiadomo¶ci news:blp1rc$rbv$ snipped-for-privacy@inews.gazeta.pl...

powiedzmy szczerze ... napisa³em w assemblerze u¿ywaj±c Keila ... ;-)

Napisa³em to samo w moim Keilu 5.5 i nie ma tego efektu ani bezsensownej linii:

<zbêdna linia>

Tak po prostu siê zdarza ... kompilatory dzia³aj± pod³ug pewnego wzorca i dla typowych konwersji, dzia³añ na pointerach itp maj± typowe szkielety funkcji, podstawieñ. S± to efekty uboczne najczê¶ciej nieszkodliwe i nie nale¿y siê tym za bardzo przejmowaæ, chyba ¿e te R4/R5 do czego¶ u¿ywasz i Ci to przeszkadza. Wtedy widzê dwa wyj¶cia:

- napisaæ funkcjê w assemblerze (to ju¿ prawie zrobi³e¶ :-) )

- u¿yæ jakiej¶ opcji kompilatora 'optimize size' ? Nie wiem dok³adnie jak to w Twoim Keilu 7 wygl±da, bo mam starego wypróbowanego Keila 5.5, ale spróbuj podzia³aæ w tym kierunku mo¿e ?

Pzdr,

Marek

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required