无法在正确的地址找到数据区中定义的字符串

时间:2013-09-17 20:15:02

标签: assembly arm keil cortex-m

我在ARM程序集中为cortex定义了两个段--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内存视图时,该地址的内存为空。相反,我在Read Only区域的代码后面找到了字符串。那么请你告诉我如何将字符串放在内存中的正确位置?

由于

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

如果您已在编译器选项中指定了其段起始地址,那么

的输出是什么
readelf -S

nm | grep myData