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
"immediate values are signified by a leading # symbol." Was macht dann =? Mfg Thomas Pototschnig
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
= 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.
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.
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
@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.
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.
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.