MC 167 Assembler Programmstruktur warten Wartezeit

Gast #3011097
Lesenswert?

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
Gast #3011152
Lesenswert?

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.
Gast #3011159
Lesenswert?

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
Gast #3011198
Lesenswert?

@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
Gast #3011235
Lesenswert?

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
#3011474
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren