2016-09-08 2 views
0

Ich habe die folgende vereinfachte memcpy32-Funktion geschrieben, um zu verstehen, wie man Assembler-Code für den cortex-m4 schreibt.Wie man Daumen-2-Anweisungen mit GCC verwendet

.section .text 
    .align 2 
    .global as_memcpy32 
    .type as_memcpy32, %function 
as_memcpy32: 
    push {r4, lr} 
    movs r3, #0 
start_loop: 
    cmp  r3, r2 
    bge end_loop 
    ldr r4, [r1] 
    str r4, [r0] 
    add r0, #4 
    add r1, #4 
    add r3, #1 
    b  start_loop 
end_loop: 
    pop  {r4, pc} 

Der obige Code wird kompiliert und ausgeführt. Dies sind nur 16-Bit-Anweisungen. Ich möchte auch 32-Bit-Thumb2-Anweisungen verwenden, da diese vom Cortex-M4 unterstützt werden. Und der Hauptpunkt beim Schreiben von Assemblys ist, meinen Code schneller auszuführen.

ich sollte die folgenden Optionen, um die GCC

op{type}{cond} Rt, [Rn], #offset; post-indexed 

Ich liefert die folgende Form der LDR und str Anweisung verwenden, nach dem STM32F4 Handbuch können.

arm-none-eabi-gcc" -c -g -x assembler-with-cpp -MMD -mcpu=cortex-m4 -DF_CPU=168000000L -DARDUINO=10610 -DARDUINO_STM32DiscoveryF407 -DARDUINO_ARCH_STM32F4 -DMCU_STM32F406VG -mthumb -DSTM32_HIGH_DENSITY -DSTM32F2 -DSTM32F4 -DBOARD_discovery_f4 -mthumb -D__STM32F4__ memcpy.S" -o memcpy.S.o 

Wenn ich versuche, die folgenden Anweisungen für ldr und str

ldr r4, [r1], #4 
ldr r4, [r0], #4 

ich folgende Fehlermeldungen erhalten zu verwenden.

memcpy.S: Assembler messages: 

memcpy.S:11: Error: Thumb does not support this addressing mode -- `ldr r4,[r1],#4' 

memcpy.S:12: Error: Thumb does not support this addressing mode -- `str r4,[r0],#4' 

exit status 1 
Error compiling for board STM32 Discovery F407. 

Ich bin nicht in der Lage zu verstehen, was das Problem ist. Tatsächlich hat der Compiler selbst einen viel komplexeren Adressierungs-Opcode erzeugt.

ldr.w r4, [r1, r3, lsl #2] 
str.w r4, [r0, r3, lsl #2] 

dank

Antwort

3

fand ich nur, dass ich

.syntax unified 

unter

.section 

das folgende Thema beschäftigt sich mit anderen Dingen sagen sollte, aber ich sah es dort und versuchte. Es funktionierte.

How to generate the machine code of Thumb instructions?

+2

'.Syntax unified' die erste Zeile der Quelldatei sein kann. [Die Richtlinie gilt global] (https://sourceware.org/binutils/docs/as/ARM-Directives.html), nicht nur innerhalb eines Abschnitts. –

Verwandte Themen