Vergleich auf ARM7 (ASM)

Gast #578361
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
Gast #578378
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.
Gast #578380
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.
#578381
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
Gast #578386
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.
Gast #578475
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.
#578497
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.