有人知道如何将程序放在内存中任意地址的ARM汇编器中吗?默认情况下,该程序位于地址0x00000008开始,但是有必要将其例如定位在地址0x20002000上。我尝试使用DCD 0x20002000
,但这只会更改寄存器指针,而程序仍保留在旧地址。 SPACE 0x400
命令可以很好地工作,但是如果地址太大,则编译将花费很长时间。告诉我,也许面对这个?
答案 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。
为了描述在链接器脚本中实现相同结果所需的确切更改,我需要查看其内容。