2

我在 ARM 程序集中为皮质定义了两个段 - M4,一个是代码(只读),另一个是数据(读写)。只读存储器定义为从地址 0x08000000 开始,RW 存储器从 0x20000000 开始。每个段都在其自己的程序集文件中定义,并且标签名称被正确导出/导入。

数据段写为:

    AREA myData, Data, READWRITE
EXPORT myString

    myString DCB "To be or not to be, that is the question"
    END

在代码中,我使用 LDR R0, =myString 加载字符串的地址

R0 正确地将地址 0x20000000 加载到 R0 中。但是当使用 Keil uVision IDE 内存视图时,该地址处的内存是空的。相反,我在只读区域中的代码后面找到了字符串。那么你能告诉我如何将字符串放在内存中的正确位置吗?

谢谢

4

3 回答 3

3

您是否在执行汇编代码之前运行 C 运行时?如果为字符串提供初始值,则必须将其存储在程序存储器中,然后在运行时复制到 RAM。AC 运行时应该为您执行此操作,或者如果您只运行汇编代码,您可以自己执行此操作,但必须显式完成。

于 2013-09-17T22:57:47.497 回答
1

DATA 区域不应该用于定义常量...使用 CODE 区域来定义常量。通过这种方式,您可以访问字符串并将其读入寄存器,然后根据需要将其写入内存。DATA 区域应用于使用 SPACE 指令为程序分配内存。

我读过的每本教科书/手册都声称您可以在 DATA 区域中定义一个常量,但我还没有看到它起作用。

于 2013-09-20T20:00:55.137 回答
0

如果您在编译器选项中指定了其段起始地址,则输出是什么

readelf -S

或者

nm | grep myData
于 2013-09-18T01:01:27.657 回答