【发布时间】:2017-04-13 00:35:03
【问题描述】:
所以我为 TI 微控制器编译了一个简单的 ARM 程序集(特别是 THUMB)程序。我只是对 EQU 和 DCD 存储在内存中的位置(RAM 与 ROM)以及 AREA 指令如何与之相关感到困惑。我从这个开始:
Y1 EQU 0x23
AREA |.text|, CODE, READONLY, ALIGN=2
THUMB
X2 DCD 0x23
Y2 EQU 0x23
MOV R0, #0
LDR R1, =X2
STR R0, [R1]
END
我假设由于 EQU 是恒定的,它们进入 ROM。但在这里,它们位于只读的代码部分(所以我假设它在 ROM 中)和在没有 AREA 指令的部分中。我不确定那里的默认值是什么。
DCD 在 READONLY 部分中声明,但我仍然可以对其进行写入。
如果我将 DCD 添加到空白部分,则会收到错误消息:Area directive missing。如果我添加 AREA 指令,那么代码如下所示:
AREA |.data|, DATA
X1 DCD 0x23
Y1 EQU 0x23
AREA |.text|, CODE, READONLY, ALIGN=2
THUMB
EXPORT Start
X2 DCD 0x23
Y2 EQU 0x23
Start
MOV R0, #0
LDR R1, =X1
STR R0, [R1]
MOV R0, #0
LDR R1, =X2
STR R0, [R1]
END
EQU 和 DCD 无处不在,AREA 指令似乎根本不会影响我如何访问它们。此外,将 READONLY 添加到 AREA DATA 指令也没有效果。
【问题讨论】:
-
EQU 指令不分配任何内存,因此它不会“去”任何地方。它只是为符号分配一个值。 DCD 指令在当前部分为一个或多个 32 位字分配内存,使用给定值初始化字,然后分配分配给符号的第一个字的地址。 AREA 指令对 ROM 或 RAM 中是否有任何内容没有直接影响。这取决于如何配置链接器以将部分映射到 ROM 或 RAM。如果您写入 READONLY 部分,汇编器不会给出错误,并且 CPU 可能会忽略对 ROM 的任何写入。
-
汇编语言特定于汇编器,即您正在使用的软件。您在这里使用什么汇编程序/软件? ARM 不是一个充分的答案,因为它不是一个软件程序,而是制造许多 cpu 内核的公司。
-
如前所述,EQU 就像 C 中的定义一样,它没有存储空间,它只是程序中的 ascii 替代解决方案,在组装之前发生的搜索和替换。 DCD 确实分配了空间,但它在节内,您可以并且需要 .data 和 .text 中的数据项。在 .text 中,您需要例如不能立即加载的地址。正如您演示的 (ldr r1,=x2) 所展示的解决此问题的技巧,它在 .text 空间中为该地址分配一个 32 位数据项。 LINKING 确定 .text 和 .data 的位置,如果您愿意,它们都可以在 ram 中...
-
@old_timer 我正在使用 Keil uVision。另外,如果EQU只是程序中的一个替换,那我为什么要写
LDR R0, =SomeEQULabel呢?它用什么代替标签?它不能放置整个立即数,因为它是 32 位的,而且 LDR 无论如何也不接受立即数 -
使用其他汇编器你绝对可以使用 ldr r0,=0x12345678。你认为标签是什么?一个地址,一个 32 位地址,所以 ldr r0,=someaddress 只是说当你弄清楚我想要它在那个寄存器中的地址时,所以为我分配一个位置并用 pc 相对负载替换它。