2016-09-08 6 views
0

Я написал следующую упрощенную функцию memcpy32 как средство понимания того, как писать код сборки для cortex-m4.Как использовать инструкции большого пальца-2 с GCC

.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} 

Приведенный выше код компилируется и запускается. Это всего лишь 16-битные инструкции. Я хочу использовать 32-битные инструкции thumb2, так как они поддерживаются Cortex-M4. И главным моментом написания сборки является быстрый запуск моего кода.

я должен быть в состоянии использовать следующую форму LDR и ул инструкции по STM32F4 инструкции

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

Я поставляет следующие опции в НКУ.

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 

Когда я пытаюсь использовать следующие инструкции для LDR и ул

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

я получаю следующие ошибки.

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. 

Я не могу понять, в чем проблема. На самом деле сам компилятор сгенерировал намного более сложный код операции адресации.

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

благодаря

ответ

3

Я только что узнал, что я должен сказать

.syntax unified 

ниже

.section 

В следующем разделе сделок с другими вещами, но я видел его там и попробовал. Это сработало.

How to generate the machine code of Thumb instructions?

+2

'.syntax unified' может быть первая строка исходного файла. [Директива применяется во всем мире] (https://sourceware.org/binutils/docs/as/ARM-Directives.html), а не только в разделе. –