Assembler Fehler arm-none-eabi-as invalid constant after fixup

OP #7104794
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'.
Persönliche Seite #7104818
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.
OP #7104845
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren