Forum: Mikrocontroller und Digitale Elektronik arm-none-eabi-as macht MOVW aus LDRH


von Daniel (Gast)


Lesenswert?

Hallo,
1
$arm-none-eabi-as -march=armv7e-m -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=vfpv4 main.s -o main.o
2
$arm-none-eabi-ld -T memory.ld main.o -o main.elf
3
4
$cat main.s
5
    .equ BITS32, 0x11223344
6
    .equ BITS16, 0xABCD
7
    .equ BITS8, 0xEE
8
    ldr R1, =BITS32 
9
    ldrh R2, =BITS16
10
    ldrb R3, =BITS8  
11
12
$arm-none-eabi-objdump -D main.elf
13
 8000086:  4909        ldr  r1, [pc, #36]  ; 
14
 8000088:  f64a 32cd   movw  r2, #43981  ; 0xabcd
15
 800008c:  f04f 03ee   mov.w  r3, #238  ; 0xee

Frage 1.
Gibt es eine Möglichkeit (as Schalter?) die Instruktionen beizubehalten?
Schließlich soll Assember den Scharm haben, möglichst durchschaubaren
Output zu erzeugen. Schreibt ARM diese Tranformation vor?

Frage 2.
Was ist der Unterschied zwischen movw und mov.w?

Frage 3.
Darf as die Instruktionen umschichten / reorder?
1
$ arm-none-eabi-as --version
2
GNU assembler (GNU Tools for Arm Embedded Processors 9-2019-q4-major) 2.33.1.20191025

Gruß,
Daniel

: Bearbeitet durch Moderator
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

So ist es definiert:
https://developer.arm.com/documentation/dui0489/c/arm-and-thumb-instructions/pseudo-instructions/ldr-pseudo-instruction

Daniel schrieb:
> Gibt es eine Möglichkeit (as Schalter?) die Instruktionen beizubehalten?

Nicht dass ich wüsste.

Daniel schrieb:
> Schließlich soll Assember den Scharm haben, möglichst durchschaubaren
> Output zu erzeugen.

Naja, das ist nicht die Anforderung an die Entwicklung von Assemblern. 
Es geht um die Erzeugung effizienten Codes und nachrangig um möglichst 
einfache Assembler-Programmierung. Und MOV(.W) ist (deutlich) 
effizienter als LDR; dass der Assembler automatisch das Bestmögliche 
nutzt vereinfacht die Entwicklung.

Daniel schrieb:
> Schreibt ARM diese Tranformation vor?

LDR rX, =... ist eine Pseudo-Instruktion, deren Sinn es ist, in ein 
"echtes" LDR (PC-relative) oder eben MOV (mit Immediate) umgewandelt zu 
werden. Wenn du ein "echtes" LDR haben willst (warum?), codiere es 
manuell:
1
.text
2
BITS16:
3
.hword 0xABCD
4
5
main:
6
ldrh r2, BITS16

Daniel schrieb:
> Frage 2.
> Was ist der Unterschied zwischen movw und mov.w?

Siehe hier: 
https://developer.arm.com/documentation/ddi0403/d/Application-Level-Architecture/Instruction-Details/Alphabetical-list-of-ARMv7-M-Thumb-instructions/MOV--immediate-?lang=en 
. Beim Laden von Immediates besteht der Unterschied darin, wie der 
Immediate-Wert in der Instruktion kodiert ist, weil ARM da verschiedene 
Varianten für verschieden strukturierte Werte kennt. MOV.W benutzt 
ThumbExpandImm_C, MOVW nutzt ZeroExtend. Siehe 
https://developer.arm.com/documentation/ddi0403/d/Application-Level-Architecture/The-Thumb-Instruction-Set-Encoding/32-bit-Thumb-instruction-encoding/Modified-immediate-constants-in-Thumb-instructions?lang=en. 
Bei MOV von Register nach Register gibt es nur eine MOV.W-Variante, 
welche im Gegensatz zur 16bit-MOV-Variante noch die Flags setzen kann 
(MOVS.W).

So im Detail muss man sich da aber normalerweise nicht mit beschäftigen, 
wenn man nicht gerade einen eigenen (Dis)assembler oder Prozessor baut.

Daniel schrieb:
> Darf as die Instruktionen umschichten / reorder?

Definiere "umschichten". Instruktionen umsortieren tut er nicht.

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Hi Niklas,

es war mir nicht bewusst, dass ldr mit = eine Pseudoinstruktion ist.

Danke für die Erläuterung. Ich versuche ldrh wenn ich wieder am PC bin.

Gruss,
Daniel

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.