Forum: Mikrocontroller und Digitale Elektronik Assembler Prg. überprüfen


von Florian S. (sirius7)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Alex S. schrieb:
> würde mich über Eure Anmerkungen freuen.
Welcher Prozessor?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Sieht nach AVR aus und damit ideal für den eingebauten Simulator in 
Atmel Studio oder AVR Studio.

von Florian S. (sirius7)


Lesenswert?

Lothar M. schrieb:
> Alex S. schrieb:
>> würde mich über Eure Anmerkungen freuen.
> Welcher Prozessor?

Atmel AVR

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

von Florian S. (sirius7)


Lesenswert?

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.

von Florian S. (sirius7)


Lesenswert?

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!

von Florian S. (sirius7)


Lesenswert?

hmm, warum geht eigentlich nicht direkt vom xl direkt in r16 laden? mit 
ld r16, xl ? add  r16, xl geht ja..

von Marc V. (Firma: Vescomp) (logarithmus)


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.

von Heinz L. (ducttape)


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?

von Marc V. (Firma: Vescomp) (logarithmus)


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.

: Bearbeitet durch User
von Florian S. (sirius7)


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 )

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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...

von Heinz L. (ducttape)


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? :)

von spess53 (Gast)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Marc V. (Firma: Vescomp) (logarithmus)


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.

: Bearbeitet durch User
von Ralf G. (ralg)


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. ^^

von Marc V. (Firma: Vescomp) (logarithmus)


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

von S. Landolt (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
Noch kein Account? Hier anmelden.