Forum: Mikrocontroller und Digitale Elektronik Vergleich auf ARM7 (ASM)


von Peter Pippinger (Gast)


Lesenswert?

Hallo NG,

Gibts irgendwo eine tolle Beschreibung von ARM7 Assemblerbefehlen 
(AT91SAM256S). Habe vor zig Jahren mal den TASM von Borland benützt. Da 
war ein super Handbuch dabei. Ist aber leider i386. Ich kann mir 
folgendes nicht erklären:

geht:
ldr     r3, =1111111110111111111b
cmp     r2, r3

geht nicht:
cmp     r2, #1111111110111111111b

Danke!
Peter

von Thomas P. (pototschnig)


Lesenswert?

"immediate values are signified by a leading # symbol."

Was macht dann =?

Mfg
Thomas Pototschnig

von Peter Pippinger (Gast)


Lesenswert?

Naja, weiß nicht, was = dann macht. Auf jeden Fall stehts so bei mir im 
Quelltext und funktioniert.

Das andere Beispiel funktioniert nicht... Ich nehme die IAR Workbench 4

MfG
Peter

von Florian (Gast)


Lesenswert?

= ist immediate für ldr und co. Sonst wäre die Adresse gemeint.

Beim cmp gibt es m.W. einen Shifter-Operand (ich meine, das wären 8-bit 
+ 4-bit Rotate / Shift). Simpel gesagt kannst Du damit Deine Konstante 
nicht darstellen.

von Florian (Gast)


Lesenswert?

Sorry, ich glaube, das war doch anders mit dem =. Der Assembler legt den 
Wert wohl als Konstante an und substituiert den Operanden dann durch die 
Adresse. Vielleicht kannst Du das ja im Output bzw. Disassemblat 
nachvollziehen.

von Thomas P. (pototschnig)


Lesenswert?

Aus dem Instructionset:
1
Syntax:
2
LDR{cond} <Rd>, =<expression>
3
LDR{cond} <Rd>, =<label-expression>
4
5
Description:
6
The LDR pseudo-instruction will generate an instruction to load the destination register
7
with the desired value.
8
The <expression> field must evaluate to a numeric constant. If the constant is an
9
allowable immediate expression (or the complement of one), a MOV or MVN instruction
10
will be generated. If it is not, the assembler will place the value in a memory location,
11
and generate a PC-relative load instruction to load it from that memory location.
12
If a label is specified, the assembler will generate a local memory location to store the
13
label address, and include the appropriate linker directives so that the correct address
14
will be in that location after linking.

Den Unterschied im Ergebnis versteh ich dann aber auch nicht ...

Mfg
Thomas Pototschnig

von Florian (Gast)


Lesenswert?

@Thomas:

Das Problem ist, wie beschrieben, dass der CMP die Konstante nicht als 
immediate nehmen kann (Shifter Operand). Dummerweise habe ich die Doku 
gerade nicht parat und kann den Teil dort nicht rauskopieren.

von Matthias (Gast)


Lesenswert?

Wenn dich der Befehlssatz genau interessiert, dann suche auf der ARM 
Seite nach dem ARM architecture reference manual. Breite Konstanten 
innerhalb des Befehls werden von keinen ARM Befehlen unterstützt, dafür 
sind die festen 32Bit Befehlsbreite eben zu kurz.

von Thomas P. (pototschnig)


Lesenswert?

Matthias wrote:
> Wenn dich der Befehlssatz genau interessiert, dann suche auf der ARM
> Seite nach dem ARM architecture reference manual. Breite Konstanten
> innerhalb des Befehls werden von keinen ARM Befehlen unterstützt, dafür
> sind die festen 32Bit Befehlsbreite eben zu kurz.

Deshalb gibts dann den LDR-Pseudo-Opcode, der vorgaukelt man könnte 
32Bit Immediates verwenden?

Tricky :-)

Mfg
Thomas Pototschnig

von Florian (Gast)


Lesenswert?

> Deshalb gibts dann den LDR-Pseudo-Opcode, der vorgaukelt man könnte
> 32Bit Immediates verwenden?

genau so ist das.

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.