From: Kalus M. <mic...@on...> - 2008-05-01 10:49:58
|
Moin. Ich versuche gerade das DO_NEXT des amforth zuverstehen. Suchen in der mailing list ergab dazu "no result". Gibt es da ein link zu einer Erklärung? Kommentiert (aber nicht unbedingt verstanden) habe ich das bisher so: DO_NEXT: ; 24 CPU cycles to ijmp C:001c0e f06e brts DO_INTERRUPT C:001c0f 01fd movw zl, XL ; READ IP: Z <-- IP C:001c10 + readflashcell wl, wh C:001c10 0fee lsl zl ; Z*2 C:001c11 1fff rol zh C:001c12 9185 lpm wl, Z+ ; w <-- (Z) C:001c13 9195 lpm wh, Z+ C:001c14 9611 adiw XL, 1 ; INC IP DO_EXECUTE: ; 12 cpu cycles to ijmp C:001c15 01fc movw zl, wl ; Z <-- W C:001c16 + readflashcell temp0,temp1 C:001c16 0fee lsl zl ; Z*2 C:001c17 1fff rol zh C:001c18 9105 lpm temp0, Z+ ; temp <-- (Z) C:001c19 9115 lpm temp1, Z+ C:001c1a 01f8 movw zl, temp0 ; Z <-- temp C:001c1b 9409 ijmp ; jump (Z) Da gibt es also 3 indirekte Ladevorgäng und gleich 2x die Multiplikation mit 2. IP ist ein 16Bit Zähler. - Warum wird der x2 genommen um von der so ermittelten Addresse im Flash den Wert für W zu holen? - Der Wert in W ist nun ein Zeiger dorthin, wo der ausführbare Code beginnt, oder? Warum muss der wiederum erst noch x2 genommen werden, um dann über diesen Zeiger einen Zeiger zu holen von dort den PC zu laden? Irgendwie blicke ich gerade nicht durch. Ist das nicht eine Stufe zuviel "indirect threading code" ? Michael |