Assembler Prg. überprüfen

OP #4638726
Lesenswert?

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.
(Firma: Vescomp) #4638842
Lesenswert?

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

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?
(Firma: Vescomp) #4638862
Lesenswert?

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.
OP #4638876
Lesenswert?

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 )
#4638903
Lesenswert?

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? :)
Gast #4638918
Lesenswert?

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
(Firma: Vescomp) #4638951
Lesenswert?

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

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. ^^
(Firma: Vescomp) #4638980
Lesenswert?

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

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