ARM空间分段(lst文件夹下map文件)

对于ARM,堆是向上生长的,栈是向下生长的。

局部变量占用栈(stack)空间。

程序中动态申请的如malloc()和new函数申请的内存空间占用堆(heap)空间。


|Image$$RO$$Base|
表示RO输出段运行时起始地址,也可以说是程序代码存放的起始地址,由-ro-base这个参数指定;
|Image$$RO$$Limit|
表示RO输出段运行时存储区域界限,其值可通过|Image$$RO$$Base|+Code sizes+RO Data sizes+4计算得出;
|Image$$RW$$Base|
表示RW输出段运行时起始地址,记得是运行时的地址,而不一定是加载时的存放地址,因为RW输出段在加载时可能是在ROM中并紧跟着RO输出段存放的,当程序运行时才移动(在有些书中说是移动,个人觉得应该只是复制,希望大家能帮我解释一下,谢谢!)到RAM起始地址为|Image$$RW$$Base|的区域,由-rw-base这个参数指定;未指定的话,默认紧跟RO输出段,那么|Image$$RW$$Base|=|Image$$RO$$Limit|;
|Image$$RW$$Limit|
表示RW输出段运行时存储区域界限,其值可通过|Image$$RW$$Base|+RW Data sizes+4计算得出;
|Image$$ZI$$Base|
表示ZI输出段运行时起始地址,它是运行时在RAM中生成的,紧跟着RW输出段存放,其值和|Image$$RW$$Limit|一样;
|Image$$ZI$$Limit|
表示ZI输出段运行时存储区域界限,其值可通过|Image$$ZI$$Base|+ZI Data sizes+4计算得出。

CODE 是 RO-CODE同义词,也是.text同义词
CONST是RO-DATA同义词,也是.constdata同义词
DATA是RW-DATA同义词,也是.data同义词
ZI是.bss的同义词

  Total RO  Size (Code + RO Data)                12216 (  11.93kB)
  Total RW  Size (RW Data + ZI Data)               292 (   0.29kB)
  Total ROM Size (Code + RO Data + RW Data)      12412 (  12.12kB)

应用程序的堆栈(stack)和堆(heap)是在C库函数初始化过程中建立起来的,在ADSl.2或更新版本中,在缺省状态下C库函数初始化代码会将连接器生成的符号Image$$ZI$$Limit地址作为堆的基地址。在分散加载时,连接器会将用户的__user_initidl_stackheap()函数代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。

    __user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:

    r0—堆基地址;

    r1—堆栈基地址;

    r2—堆长度限制值(需要的话);

    r3—堆栈长度限制值(需要的话)。
    当用户使用分散加载功能的时候,必须重新实现一user_initial_staacklaeap(),否则连接器会报错:
    Error:L6218E:Undefined symbol Imager$$ZI$$一Limit(referred from sys_stackheap.o)。
    注:Image$$ZI$$Limit变量为零初始化段(ZI段)的末地址。未使用分散加载时,堆默认就定位在ZI段的末地址,而栈通常位于RAM的顶端

 

(2)使用两个存储区
    汇编语言如下:

这种方式定义的堆栈和堆分别采用两个不同存储区。堆栈采用向下增长,从地址Ox40000到地址Ox20000;堆采用向上增长,从地址0x28000000到地址0x28080000,如图4所示。

 

### 配置DOSBox以确保MASM编译时生成LSTMAP文件 为了使MASM在DOSBox环境中编译时能够生成`.lst`(列表文件)和`.map`(映射文件),需要正确设置MASM的调用参数以及确认DOSBox配置无误。 #### MASM命令行参数调整 当使用MASM进行编译时,可以通过向MASM传递特定选项来控制其行为。对于生成列表文件和映射文件而言,在执行MASM命令时应加入相应的开关: - `/Fl`: 表示创建源代码清单文件(.lst),该文件包含了汇编过程中的每一行原始输入及其产生的机器码。 - `/Zd`: 创建调试信息文件(.dbg),虽然这不是严格意义上的.map文件,但在某些情况下也可以提供有用的调试数据。 - 若要获得完整的符号表和地址映射,则需额外安装链接器并使用适当选项生成.map文件[^3]。 因此,假设有一个名为`example.asm`的源文件,那么可以在DOSBox中通过如下方式调用MASM: ```batch masm /Fl/example.lst example; ``` 这将会告诉MASM为当前正在处理的assembly文件创建一个名为`example.lst`的列表文件。 请注意,在DOSBox环境下运行程序时,指定路径应当采用正斜杠(/)而非反斜杠(\)。 #### DOSBox配置优化 除了正确地给定MASM参数外,还需要保证DOSBox本身被适当地配置以便支持这些操作。特别是要关注以下几个方面: - **内存分配**:确保有足够的RAM供模拟环境使用; - **CPU周期数**:如果发现性能不足或者响应缓慢的情况,尝试增加每秒模拟的CPU周期数量; - **工作目录设定**:让DOSBox知道在哪里查找您的项目文件夹,并将其设为默认的工作区; - **自动加载脚本**:编写批处理文件或修改现有的conf文件,使得每次启动DOSBox都能快速进入开发状态而不必重复手动输入相同指令。 具体到编辑配置文件的位置,应该定位至用户的AppData本地存储位置下的dosbox配置文件,即类似于这样的路径:“C:\Users\[用户名]\AppData\Local\DOSBox\dosbox-0.74.conf”。这里才是真正生效的地方,而不是安装目录内的bat文件[^2]。 完成上述更改之后重新启动DOSBox再试一次编译流程,此时就应当能看到预期的结果——既有了目标二进制文件也得到了辅助性的.LST/.MAP文档。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值