Forum: Mikrocontroller und Digitale Elektronik ARM Assembler - Kopieren von Daten


von Peter W. (ja_wasser)


Lesenswert?

Hallo,
und zwar sollen wir folgendes machen:
Wir haben eine Liste1:

Liste1: .byte -9, 8, -7, 6, -5, 4, -3, 2, -1, 0, 127, 128

und diese jeweils 1 byte-Zahlen sollen wir in eine Liste2 als 32bit 
Zahlen kopieren. Davor sollen wir aber diese 1 Byte-Zahlen in 32bit 
Zahlen (also 4 Byte) umwandeln (???).

Ich hab da bis jetzt sowas:

Copy:
  mov ip, #0        @ Zähler für Schleife
  LDRB   r1, =Liste1
  LDR   r2, =Liste2
Loop:
  LDRB  r0, [r1], #1
  STR   r0, [r2], #4
  add   ip, ip, #1
  cmp   ip, r3
  blt   Loop

Das funktioniert aber überhaupt gar nicht. Weder funktioniert die 
for-schleife noch das Laden in das Register r0. Im Debugger bleibt r0 
einfach r0, da ändert sich einfach nichts.

Weiß wer was daran falsch ist? Ich wandel hier natürlich nicht diese 
8bit Zahlen aus Liste1 in 32bit Zahlen um, weil ich auch nicht wirklich 
weiß wie das geht. Ich könnt mir vorstellen das man die 8bit Zahlen dann 
halt um 24 Stellen nach rechts shiftet mit LSR, dadurch würde man dann 
ja links von der 8 Bit Zahl alles mit 24 Nullen auffüllen und dann wäre 
es wohl irgendwie 32bit. Aber das hauptproblem ist, dass das hier
LDRB  r0, [r1], #1
überhaupt nicht funktioniert. Da wird einfach kein Wert in r0 
gespeichert. r0 bleibt laut debugger bei 0x0.

Weiß da wer weiter?

: Verschoben durch User
von ARMschlumpf (Gast)


Lesenswert?

1. Fehler den ich seh:

> LDRB   r1, =Liste1

In r1 soll ein Adresse. Das sind 32 bit.

Weiter guck ich mal nicht...

von Carl D. (jcw2)


Lesenswert?

Warum soll es gut sein, von der Adresse eines Speicherblocks nur die 
unteren 8bit zu benutzen?
Was bedeutet wohl das B am Ende von LDRB?

von nfet (Gast)


Lesenswert?

godbolt.org
Tipps in C ein und lasse lösen. Du hast Glück, dass jemand Compiler 
erfunden hat.

von . . (Gast)


Lesenswert?

1
copy:
2
 ldr r1,=Liste1
3
 ldr r2,=Liste2
4
 ldr r3,=EndOfListe1
5
loop:
6
 ldrb r0,[r1],#1
7
 sxtb r0
8
 str r0,[r2],#4
9
 cmp r1,r3
10
 bne __loop

von Peter W. (ja_wasser)


Lesenswert?

Ah ja danke, daran lag es.

Ich habs jetzt soweit:

Copy:
  mov   ip, #0    @ Zähler für Schleife
  LDR   r1, =Liste1
  LDR   r2, =Liste2
  mov  r3, #13    @ Anzahl der Elemente

Loop:
  LDRB  r0, [r1], #1
  STR   r0, [r2], #4
  add   ip, ip, #1
  cmp   ip, r3
  blt   Loop

Loop funktioniert und er liest zumindest positiven 8bit Zahlen richtig 
ein. Aber das Problem ist jetzt, dass die negativen 8bit Zahlen aus 
Liste1 nicht richtig eingelesen werden. Wenn er eine -3 einlesen soll, 
liest er stattdessen eine 253 ein. Bei den 8Bit Zahlen geht es wohl von 
0 bis 255 und nicht von -128 bis 128.

So wie ich es mir überlege muss ich dann wohl, wenn eine Zahl größer als 
128 eingelesen wird (d.h. die Zahl ist eigentlich negativ), diese Zahl 
minus 1 rechnen, alle Bits umkehren (d.h. das 2er Komplement nur 
rückwärts) und dann mit -1 multiplizieren damit es richtig wird.

von . . (Gast)


Lesenswert?

1
 ldrb r0,[r1],#1
2
 sxtb r0
3
 str r0,[r2],#4

von Peter W. (ja_wasser)


Lesenswert?

.                                                . schrieb im Beitrag 
#5432381:
>
1
>  ldrb r0,[r1],#1
2
>  sxtb r0
3
>  str r0,[r2],#4
4
>

Jo danke. Das mach ich, falls mein Weg nicht funktioniert. Denn den 
Befehl sxtb hatten wir noch nicht, bin deshalb nicht sicher ob wir den 
benutzen dürfen.

Beitrag #5432401 wurde vom Autor gelöscht.
von (prx) A. K. (prx)


Lesenswert?

Oder so?
 mov   ip, #12
 ldr   r1, =liste1+12
 ldr   r2, =liste2+48
loop:
 ldrsb r0, [r1, -ip]
 str   r0, [r2, -ip, lsl #2]
 subs  ip, ip, #1
 bne   Loop

: Bearbeitet durch User
von . . (Gast)


Lesenswert?

Peter W. schrieb:
> .                                                . schrieb im Beitrag
> #5432381:
>>
1
>>  ldrb r0,[r1],#1
2
>>  sxtb r0
3
>>  str r0,[r2],#4
4
>>
>
> Jo danke. Das mach ich, falls mein Weg nicht funktioniert. Denn den
> Befehl sxtb hatten wir noch nicht, bin deshalb nicht sicher ob wir den
> benutzen dürfen.

Kindergarten Zwergengruppe?
Dann eben für Lehrplanleerer (kein Typo :P) eine andere illegale 
Variante. Dürft ihr schon Verschieben?
1
 ldrb r0,[r1],#1
2
 lsl r0,r0,#24
3
 asr r0,r0,#24
4
 str r0,[r2],#4

von Peter W. (ja_wasser)


Lesenswert?

.                                                . schrieb im Beitrag 
#5432481:
> Kindergarten Zwergengruppe?
> Dann eben für Lehrplanleerer (kein Typo :P) eine andere illegale
> Variante. Dürft ihr schon Verschieben? ldrb r0,[r1],#1
>  lsl r0,r0,#24
>  asr r0,r0,#24
>  str r0,[r2],#4

Jop danke, das dürfen wir. Funktioniert auch. So wie ich es verstehe 
wird da dann zuerst die Zahl nach links verschoben mit 24 Nullen 
(logisch weil wir ja von 8bit auf 32bit wollen), und dann wird es wieder 
nach rechts verschoben, wobei dieses ASR jenachdem ob die zahl positiv 
oder negativ ist, es mit 24 0en oder 1en auffüllt.

von (prx) A. K. (prx)


Lesenswert?

Diese Variante hat den Vorzug, dass sie auch auf den ersten ARMen 
funktioniert. Die hatten weder SXTB noch LDRSB.

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.