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
'.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. –