Hallo Zusammen,
ich hab mal ne Frage.
Ich habe eine Aufgabe vor mir liegen und kann diese nicht loesen. Ist
aber in wenigen Schritten erledigt.
mov R2, #5h ;Wartezeit festlegen
Zeitschritt: mov R1, #0FFFFh ;Wartezeit festlegen
Schleife: CMPD1 R1, #00h ;Wartezeit dekrementieren u
;und mit Null vergleichen
JMP CC_NE, Schleife ;Wiederholen, solange nicht
Null
CMPD1 R2, #00h ;2. Wartezeit dekrementieren
;und mit Null vergleichen
JMP CC_NE, Zeitschritt ;Wiederholen, solange nicht
Null
Frage: Veraendern Sie das obige Programm so, dass statt der 5-fachen
Laufzeit sich moeglichst genau die 2,5-fache Zeit ergibt. Unterstreichen
Sie hierzu im obigen AssemblerCode die Zeile die Sie aendern moechten
und schreiben hier den neuen Code hin.
Wenn jemand eine Ahnung hat, wie das geht, waere ich um jeden Tipp
dankbar. Also den Programmausschnitt verstehe ich schon. Ich komm nur
nicht mit ,5 klar.
Vielen Dank schon mal vorab und viele Gruesse
Martin schrieb:> schaffe ich nicht
Dann solltest Du Dir zuerst einmal den Programmablauf aufzeichnen und
verstehen, was da passiert.
Dann müsstest Du auch erkennen, an welcher Stelle Du "drehen" musst.
Gruß Dietrich
Martin schrieb:> Hi,> noe, schaffe ich nicht. Daher bitte ich einen erfahrenen Programmierer> um die Hilfe
Befehle suchen, die die Schleife in der halben Zeit machen.
Ich kenne den 167 nicht, aber beim 8051 gibt es auch allerhand solcher
Dinge bzw. Tricks.
Möglicherweise gibt es andere Befehle, die das selbe tun, und kürzere
Ausführungszeit haben. Bspw. haben Registerbefehle beim 8051 die halbe
Laufzeit von Datenspeicher als Register.
Martin
die diskusion mit den Hausaufagen durch andere Lösen lassen, waren in
diesem Forum schon genug, daher lasse ich die Belehrungsversuche.
Lösung könnte sein:
mov R2, #5h ;Wartezeit festlegen
Zeitschritt: mov R1, #0FFFFh ;Wartezeit festlegen
Schleife: CMPD1 R1, #7FFF ;Wartezeit dekrementieren u
;und mit 0FFFFh hable
vergleichen
JMP CC_NE, Schleife ;Wiederholen, solange nicht
Null
CMPD1 R2, #00h ;2. Wartezeit dekrementieren
;und mit Null vergleichen
JMP CC_NE, Zeitschritt ;Wiederholen, solange nicht
Null
könnte gehen.
Mfg
CalM
Martin schrieb:> Wenn jemand eine Ahnung hat, wie das geht, waere ich um jeden Tipp> dankbar. Also den Programmausschnitt verstehe ich schon. Ich komm nur> nicht mit ,5 klar.
Okay, dann zeig uns mal, wie du eine beliebige ganzzahlige Vielfache
Wartezeit erreichst (2, 5, 10, 1000 fach).
Vielen Dank ich probiers aus.
Sind uebrigens keine Hausaufgaben sondern uralte Aufgaben die ich zum
lernen verwende.
Danke nochmal fuer die Bemuehungen.
@Martin
bist du dir sicher das du die Wartezeit ereitern sollst und nicht
einfach nur halbieren? So würde ich die Aufgabe verstehen. Statt 5
Facher zeit genau die 2,5 fache mach für mich Faktor 2 um die deine
Wartezeit keluiner werden soll. Nächster punkt ist das die Änderrung mit
nur einer Zeile möglich sein soll. Damit hast du dann (mindestens) zwei
mögliche Lösungen für die Aufgabe.
Mfg
CalM
Hi,
ja schon, ich versuche die Wartezeit zu halbieren.
Dekrementieren kann ich nur ganzzahlige Werte
Ich habs noch nicht ausprobiert, aber wahrs. werd ich nur
die Programmzeile
Zeitschritt: mov R1, #0FFFFh
zu dieser umformen
Zeitschritt: mov R1, #07FFFh
Es muss doch auch noch eine weitere Loesung geben
NNY schrieb:> Hi,>> ja schon, ich versuche die Wartezeit zu halbieren.> Dekrementieren kann ich nur ganzzahlige Werte>> Ich habs noch nicht ausprobiert, aber wahrs. werd ich nur>> die Programmzeile> Zeitschritt: mov R1, #0FFFFh>> zu dieser umformen> Zeitschritt: mov R1, #07FFFh>> Es muss doch auch noch eine weitere Loesung geben
Gibt es auch.
Ich geh mal auf eine Analogie.
Du hast 5 Bierkisten, in der jeweils 20 Bierflaschen stecken. Das macht
in Summe 100 Flaschen (deine Wartezeit). Wie kannst du jetzt
einigermassen gut 50 Bierflaschen (also die Hälfte davon) abpacken,
wobei du natürlich beliebig viele Kisten nehmen kannst.
Du kannst 1 Kiste nehmen und da 50 Flaschen reinstecken.
OK, das geht nicht, weil in der Kiste keine 50 Flaschen Platz haben.
Du kannst 2 Kisten nehmen und in jede 25 Flaschen. Fast. 25 Flaschen pro
Kiste gehen nicht
Du kannst 3 Kisten nehmen und in jede 16 Flaschen. Sind in Summe 48
Flaschen. Fast. Das geht noch besser
4 Kisten a 12 Flaschen. Wieder 48. Mal sehen, obs noch besser geht
5 Kisten a 10 Flaschen. Gibt genau die 50 Flaschen
6 Kisten a 8 Flaschen. Macht 48. Die 50 waren besser
7 Kisten a 7 Flaschen. Macht 49. Besser als 48, aber schlechter als 50
8 Kisten a 6 Flaschen. Hatten wir schon. 48
9 Kisten a 5. 45, unter jeder Kritik
10 Kisten a 5 Flaschen. 50. Na, also. Geht doch
....
Die Rolle der Kisten spielt in deinem Code die äussere Schleife. Die
Flaschen sind die innere Schleife. Und du suchst jetzt nach der Anzahl
der Wiederholungen, die du benötigst, damit der Kern x mal ausgeführt
wird.
Das Prinzip ist genau das gleiche, wie bei Kisten und Flaschen.
Du suchst 2 Zahlen a und b, sodass a*b eine bestimmte vorgegebene Anzahl
ergibt. Wobei es noch Nebenbedingungen gibt. Beim Bier war es die Anzahl
der Flaschen pro Kiste, die nicht höher als 20 sein kann. Bei den
Warteschleifen ist es die Anzahl der inneren Schleifen, die nich höher
als FFFFh sein kann (also 65535).
Was immer dir zum Thema Bierkisten und Flaschen einfällt, um dieses
Problem zu lösen, das kannst du im Grunde auch mit deinem Programm
machen. Zb. kannst du 6 Kisten mit 8 Flaschen machen und 1 Kiste mit
lediglich 2. Macht in Summe auch wieder die geforderten 50.