Forum: Mikrocontroller und Digitale Elektronik Assembler Fehler arm-none-eabi-as invalid constant after fixup


von Christoph K. (chriskuku)


Lesenswert?

Ich habe das folgende Code-Schnippsel (eingedampft auf das folgende 
kleine Programm). Das produziert den nachstehenden Fehler. Ändere ich 
#0x16c9 in #0x16c0, so läuft es ohne Fehler durch.
1
    .syntax unified
2
    .cpu cortex-m4
3
    .thumb
4
.equ USART3_BRR     ,   0x40004808
5
6
@ fCLK 42MHz
7
@ 0x16c9 364.58333_ 16c0 + 9
8
@ 115200 Bd
9
  ldr r1, = USART3_BRR
10
  movs r0, #0x16c9
11
  str r0, [r1]
12
13
  .ltorg
14
  .end
15
16
17
$ make
18
arm-none-eabi-as -g -al -o myfirst.o myfirst.s >myfirst.lst
19
myfirst.s: Assembler messages:
20
myfirst.s:482: Error: invalid constant (16c9) after fixup
21
make: *** [myfirst.o] Error 1
22
$ arm-none-eabi-as --version
23
GNU assembler (GNU Tools for Arm Embedded Processors 8-2018-q4-major) 2.31.51.20181213
24
Copyright (C) 2018 Free Software Foundation, Inc.
25
This program is free software; you may redistribute it under the terms of
26
the GNU General Public License version 3 or later.
27
This program has absolutely no warranty.
28
This assembler was configured for a target of `arm-none-eabi'.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

movs kann nur maximal 12bit-Literals laden. Mit movw (32bit-Instruktion) 
gehen bis zu 16bit.

Hier habe ich die Details zu Literal Loads auf ARM genauer beschrieben: 
https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Literal_loads

Am Einfachsten ist es meistens, für solche Literals "ldr rX, =..." zu 
nutzen, und den Assembler die optimale Kodierung wählen zu lassen.

von Christoph K. (chriskuku)


Lesenswert?

Niklas G. schrieb:
> movs kann nur maximal 12bit-Literals laden. Mit movw (32bit-Instruktion)
> gehen bis zu 16bit.
>
> Hier habe ich die Details zu Literal Loads auf ARM genauer beschrieben:
> https://www.mikrocontroller.net/articles/ARM-ASM-Tutorial#Literal_loads
>
> Am Einfachsten ist es meistens, für solche Literals "ldr rX, =..." zu
> nutzen, und den Assembler die optimale Kodierung wählen zu lassen.

Ah, danke. Sehr gut. Trotzdem seltsam, daß der Befehl bei 0x16c0 
akzeptiert wird, was ja immer noch größer als 2^12 ist.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Christoph K. schrieb:
> Ah, danke. Sehr gut. Trotzdem seltsam, daß der Befehl bei 0x16c0
> akzeptiert wird, was ja immer noch größer als 2^12 ist.

Die Mov Befehle haben Encodings wo der Wert geshiftet wird,
und 0x16C0= 0x5B<<6.

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.