在ARM Cortex M3汇编器中的任何地址进行编程

时间:2019-02-22 22:06:21

标签: assembly arm cortex-m3

有人知道如何将程序放在内存中任意地址的ARM汇编器中吗?默认情况下,该程序位于地址0x00000008开始,但是有必要将其例如定位在地址0x20002000上。我尝试使用DCD 0x20002000,但这只会更改寄存器指针,而程序仍保留在旧地址。 SPACE 0x400命令可以很好地工作,但是如果地址太大,则编译将花费很长时间。告诉我,也许面对这个?

enter image description here

2 个答案:

答案 0 :(得分:1)

基本上有两种方法可以使用Keil来控制代码区域的位置。使用分散文件,或使用构建选项对话框中的“目标”选项卡。

您可以定义一个IROM区域,其中包括您要放置代码的区域。您也可以使用此对话框开始生成初始分散文件,然后根据Keil文档修改分散文件。

但是,您在此处给出的位置在RAM区域中,这有点不寻常(可能效率低下,但有效)。您是否考虑过重启电源后如何初始化目标?

最大的问题是,在复位时,Cortex-M3始终会从地址0、4(由于预取而导致的地址为8)进行读取。您需要提供一个初始堆栈指针(或不使用堆栈),以及复位向量(设置为0,即T位)。内存映射可能存在硬件存储区(特定于设备),但是程序员始终认为这些提取操作从地址0开始。

答案 1 :(得分:0)

通常可以通过修改所使用的链接描述文件或为GNU ld提供某些命令行选项来获得此结果。

根据您提供的信息,我假设您的代码当前正好在两个第一个向量条目表(即初始SP值和重置值)之后开始,并且您的向量表位于0x00000000。 >

example1.s应该或多或少看起来像您当前的代码:

        .cpu    cortex-m3
        .thumb    
        .syntax unified
        .global Reset_Handler
        .equ    StackTop, 0x1000
        .word   StackTop         
        .word   Reset_Handler
Reset_Handler:
         b .
        .end


/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example1.o -c example1.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler -Ttext-segment=0x00000000 -Map=example1.map -o example1.elf example1.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d example1.elf

example1.elf:     file format elf32-littlearm

Disassembly of section .text:

00000000 <Reset_Handler-0x8>:
   0:   00001000        .word   0x00001000
   4:   00000008        .word   0x00000008

00000008 <Reset_Handler>:
   8:   e7fe            b.n     8 <Reset_Handler>

该代码将位于0x00000008。

example2.s定义了一个名为.vectors的新链接器节。

我们现在将使用GNU ld --section-start命令行选项来强制.vectors节驻留在0x00000000,并且仍然使用-Ttext-segment来强制.text节/文本段驻留在0x20002000。

example2.s:

    .cpu    cortex-m3                                                                                                                                                                                                                                              
    .thumb                                                                                                                                                                                                                                                                 
    .syntax unified                                                                                                                                                                                                                                                        
    .global Reset_Handler                                                                                                                                                                                                                                                  
    .equ    StackTop, 0x1000                                                                                                                                                                                                                                               

    .section .vectors                                                                                                                                                                                                                                                      
    .word   StackTop                                                                                                                                                                                                                                                       
    .word   Reset_Handler                                                                                                                                                                                                                                                  

    .section .text                                                                                                                                                                                                                                                         

Reset_Handler:
                 b。

/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example2.o -c example2.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler --section-start=.vectors=0x00000000 -Ttext-segment=0x20002000 -Map=example2.map -o example2.elf example2.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld: warning: address of `text-segment' isn't multiple of maximum page size
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d -j .vectors -j .text -d example2.elf

example2.elf:     file format elf32-littlearm


Disassembly of section .vectors:

00000000 <.vectors>:
   0:   00001000        .word   0x00001000
   4:   20002000        .word   0x20002000

Disassembly of section .text:

20002000 <Reset_Handler>:
20002000:       e7fe            b.n     20002000 <Reset_Handler>
        .end    

向量表仍位于正确的内存位置,但是代码现在位于0x20002000。

为了描述在链接器脚本中实现相同结果所需的确切更改,我需要查看其内容。