Hallo,
habe eine Aufgabe für Assembler gelöst, nun komme ich mit High und Low
Bytes (Big-Endian)ziemlich durcheinander und es würde mich freuen, wenn
einer drüber schaut und mich auf die Fehler hinweist.
_
zwei 16-Bit Zahlen sind im Speicher abgelegt und Registerpaare X und Y
zeigen jeweils aus das High-Byte beider Zahlen. Sie sollen addiert
werden und Ergebnis in r16:r17 zurückgeführt werden (High-Byte in r17).
Format=Big Endian.
meine Rechnung (erst mal ohne Retten):
ld r16, XH // niederwertigste Bytes in höheren Adresse
ld r17, YH
add r16,r17
st Z+,r16 // eigentlich steht in Aufgabe, es dürfen außer r17 und r16
//keine anderen Registerinhalte verändert werden,
//aber ohne zwischenpeichern in Z
//habe ich keine andere Lösung gefunden
ld r16, XL
ld r17,YL
adc r16,r17 // adc, falls bei unteren Bytes Überlauf gab
st Z, r16
ld r17, Z
ld r16,-Z
würde mich über Eure Anmerkungen freuen.
Matthias S. schrieb:> Sieht nach AVR aus und damit ideal für den eingebauten Simulator in> Atmel Studio oder AVR Studio.
Simulator gibt bei mir 4 al invalid Register aus.. ich nehme an muss an
Registerdarstellung liegen, da ich grad ganz neu in der Sache bin, fällt
mir dazu nichts ein.
Alex S. schrieb:> hmm, warum geht eigentlich nicht direkt vom xl direkt in r16 laden? mit
X steht für Registerpaar, also xl und xh zusammen und ist in diesem
Fall ein Pointer (Zeiger) welcher auf einen Wert in FLASH oder RAM
zeigt.
Und du willst nicht die Adresse, sondern den Wert der sich auf dieser
Adresse befindet.
> ld r16, xl ? add r16, xl geht ja..
Ja, aber nur weil der Wert auf den Register X vorher gezeigt hat,
schon in r16/r17 übernommen wurde und xl nicht mehr gebraucht wird.
Irgendwas hat's da.
ld ist ein Befehl um Daten aus dem SRAM in ein Register zu laden. Bist
Du sicher, dass X und Y REGISTERpaare sind? Weil Du nämlich da mit ld
drauf zugreifst, und ich wüßte jetzt nicht, dass das auf Register
funktionieren würde.
Damit erklärt sich auch die letzte Frage. xl bezieht sich nämlich im
Posting von logarithmus auf das x Doppelregister (r26:r27). Was nebenbei
die Lösung insofern invalidiert weil damit ein weiteres Register neben
r16 und r17 verwendet wird.
Kannst Du das mal eben verfizieren?
Heinz L. schrieb:> Damit erklärt sich auch die letzte Frage. xl bezieht sich nämlich im> Posting von logarithmus auf das x Doppelregister (r26:r27). Was nebenbei> die Lösung insofern invalidiert weil damit ein weiteres Register neben> r16 und r17 verwendet wird.Alex S. schrieb:> zwei 16-Bit Zahlen sind im Speicher abgelegt und Registerpaare X und Y> zeigen jeweils aus das High-Byte beider Zahlen. Sie sollen addiert> werden und Ergebnis in r16:r17 zurückgeführt werden (High-Byte in r17).
Wie man einen 16bit Wert auf den X oder Y Register zeigt, lesen kann
ohne diese zu verändern möchte ich mal sehen...
EDIT:
Auch mit LDD wird noch ein Registerpaar gebraucht.
Marc V. schrieb:> Alex S. schrieb:>> hmm, warum geht eigentlich nicht direkt vom xl direkt in r16 laden? mit> X steht für Registerpaar, also xl und xh zusammen und ist in diesem> Fall ein Pointer (Zeiger) welcher auf einen Wert in FLASH oder RAM> zeigt.> Und du willst nicht die Adresse, sondern den Wert der sich auf dieser> Adresse befindet.>>>> ld r16, xl ? add r16, xl geht ja..> Ja, aber nur weil der Wert auf den Register X vorher gezeigt hat,> schon in r16/r17 übernommen wurde und xl nicht mehr gebraucht wird.
aso, vielen Dank für die Erklärung, habs kapiert )
Marc V. schrieb:> Wie man einen 16bit Wert auf den X oder Y Register zeigt, lesen kann> ohne diese zu verändern möchte ich mal sehen...
Manoman.
Dass man eigene Beiträge nicht mehr editieren kann...
Sollte heissen:
1
Wie man einen 16bit Wert auf den X Register zeigt, lesen kann
Marc, der Satz ergibt irgendwie immer noch keinen Sinn. Warum sollte das
Lesen eines Wertes diesen verändern?
Und man kann's schon ohne zusätzliche Register lösen.
ld r16, +X
ld r17, +Y
add r16, r17
push r16
ld r16, -X
ld r17, -Y
adc r16, r17
st X+, r16
pop r16
st X, r16
Hat ja keiner was davon gesagt, dass man den Stack nicht verwenden darf,
oder? :)
Heinz L. schrieb:> Hat ja keiner was davon gesagt, dass man den Stack nicht verwenden darf,> oder? :)
Nein, aber das ist doch selbstverständlich, ansonsten wäre die Aufgabe
sinnlos, man könnte die Registerwerte auch irgendwo ins RAM schreiben
und nachher wieder einlesen.
Ausserdem:
1
ldr16,+X
2
ldr17,+Y
3
addr16,r17
a) Pre-increment gibt es bei AVR nicht.
b) Mit Post-Increment hast du die 2 High Bytes zuerst addiert.
Auf jeden Fall falsch.
Alex S. schrieb:> eigentlich steht in Aufgabe, es dürfen außer r17 und r16 keine anderen
Registerinhalte verändert werden,
Besser wäre, den exakten Wortlaut der Hausaufgabe zu kennen. 'Keine
anderen Registerinhalte ändern' könnte man auch so interpretieren, dass
die Funktion/ der Programmabschnitt nur ordentlich aufräumen soll, wenn
schon weitere Register verwendet werden.
Denn:
Alex S. schrieb:> meine Rechnung (erst mal ohne Retten):
Dann bräuchte ja auch nie was gerettet werden, wenn nichts verändert
wird. ^^
Ralf G. schrieb:> Besser wäre, den exakten Wortlaut der Hausaufgabe zu kennen.Alex S. schrieb:> Format=Big Endian.
Big Endian habe ich auch irgendwie übersehen...
Wenn X und Y auf Werte im Big-Endian zeigen, ist der Beitrag
den ich gepostet habe, auch falsch.
Sollte sein:
Das passt aber nicht zu
> es dürfen außer r17 und r16 keine> anderen Registerinhalte verändert werden
Unter dieser Bedingung fällt mir keine Lösung ein.