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.
Lothar M. schrieb: > Alex S. schrieb: >> würde mich über Eure Anmerkungen freuen. > Welcher Prozessor? Atmel AVR
Alex S. schrieb: > würde mich über Eure Anmerkungen freuen.
1 | ld r17, X |
2 | ld r16, -X |
3 | mov xl, r16 |
4 | mov xh, r17 |
5 | ld r17, Y |
6 | ld r16, -Y |
7 | add r16, xl |
8 | adc r17, xh |
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.
Marc V. schrieb: > Alex S. schrieb: >> würde mich über Eure Anmerkungen freuen. > >
1 | > ld r17, X |
2 | > ld r16, -X |
3 | > mov xl, r16 |
4 | > mov xh, r17 |
5 | > ld r17, Y |
6 | > ld r16, -Y |
7 | > add r16, xl |
8 | > adc r17, xh |
9 | >
|
hey Marc, danke der Simulator scheint das anzunehmen!
hmm, warum geht eigentlich nicht direkt vom xl direkt in r16 laden? mit ld r16, xl ? add r16, xl geht ja..
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.
:
Bearbeitet durch User
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 |
2 | ohne diesen zu verändern möchte ich mal sehen... |
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? :)
Hi > Wie man einen 16bit Wert auf den X Register zeigt, lesen kann > ohne diesen zu verändern möchte ich mal sehen... Mit 'ldd'.
1 | ) |
2 | ld r16,X |
3 | ldd r17,X-1 |
4 | |
5 | ld XL,Y |
6 | add r16,XL |
7 | |
8 | ldd XL,Y-1 |
9 | adc r17,XL |
MfG Spess
spess53 schrieb: > Mit 'ldd'. > ) > ld r16,X > ldd r17,X-1 spess53 schrieb: > Mit 'ldd'. Auweia.
1 | ld r16,X |
2 | ldd r17,X-1 |
LDD geht nicht mit X-Registerpaar
:
Bearbeitet durch User
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 | ld r16, +X |
2 | ld r17, +Y |
3 | add r16, 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.
:
Bearbeitet durch User
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:
1 | ld r17, X+ |
2 | ld r16, X |
3 | mov xl, r16 |
4 | mov xh, r17 |
5 | ld r17, Y+ |
6 | ld r16, Y |
7 | add r16, xl |
8 | adc r17, xh |
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.
Also entweder ist diese Bedingung nicht allzu ernst zu nehmen, oder es wird Stackbenutzung zugelassen; anders ist die Sache m.E. nicht zu lösen.
S. Landolt schrieb: > Unter dieser Bedingung fällt mir keine Lösung ein. Es gibt auch keine, ausser mit retten der Register (wie auch immer).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.