2016-09-08 29 views
0

cortex-m4のアセンブリコードの記述方法を理解する手段として、以下の単純なmemcpy32関数を書いています。GCCでthumb-2命令を使用する方法

.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ビット命令のみです。私はCortex-M4でサポートされているので、32ビットのthumb2命令も使用したいと考えています。アセンブリの作成の主なポイントは、自分のコードをより速く実行することです。

私は、GCCに、以下のオプションを供給していSTM32F4マニュアル

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

に従ってLDRおよびSTR命令の次の形式を使用することができなければなりません。

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とSTR

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

は、私はちょうど私が他のものと

.section 

次のトピックのお得な情報の下に

.syntax unified 

を言うべきことがわかったが、私はそこにそれを見てみました。出来た。

How to generate the machine code of Thumb instructions?

+2

'.syntax unified'は、ソースファイルの最初の行にすることができます。 [このディレクティブはグローバルに適用されます](https://sourceware.org/binutils/docs/as/ARM-Directives.html)。 –

関連する問題