在看启动文件里的汇编代码时候有一些疑惑,这里记录一下。
Heap_Size EQU 0x00000200 ; 定义堆大小为512字节
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ; 定义堆区域
__heap_base ; 堆的起始地址(符号)
Heap_Mem SPACE Heap_Size ; 分配512字节的内存给堆
__heap_limit ; 堆的终止地址(符号)
-
Heap_Mem
:这行代码通过SPACE
指令分配了 512 字节的内存,这段内存的起始地址就是Heap_Mem
的地址,表示堆的实际内存空间。 -
__heap_base
:这个符号是在Heap_Mem
之前定义的,它的值就是Heap_Mem
的地址(即堆的起始地址)。 -
__heap_limit
:这是在堆分配的空间之后定义的符号,指向堆的末尾,即Heap_Mem + Heap_Size
,用来表示堆的终止地址。
关键点:
-
__heap_base
和Heap_Mem
都指向同一个内存地址,表示堆的起始地址。__heap_base
是一个符号名称,用来清晰地表示堆的起始位置,而Heap_Mem
则是内存实际分配的位置。 -
__heap_limit
是堆的末尾,用于表示堆空间的最大边界。
_heap_base
和 Heap_Mem的
具体区别:
1. __heap_base
(符号)
- 符号 是汇编中的标签,它用于表示某个内存地址,但不分配任何内存。
- 在这个例子中,
__heap_base
只是一个名称,用来表示堆的起始地址。 - 当程序需要引用堆的起始地址时,它可以通过
__heap_base
这个符号来访问,而不用关心内存分配的具体细节。 - 符号本身不占用内存,它只是一个方便的引用工具。
2. Heap_Mem
(内存空间)
Heap_Mem
实际上是通过SPACE
伪指令分配的一段内存空间。- 在汇编中,
SPACE
伪指令会分配一段连续的内存区域,大小由Heap_Size
指定。在上面代码中,Heap_Mem
分配了0x200
(512 字节)的内存。 Heap_Mem
代表的是堆的起始地址,它指向的是这段分配的内存区域。
为什么使用 __heap_base
而不是直接使用 Heap_Mem
?
__heap_base
是为了清晰和方便。程序中的不同模块或代码段可以通过引用__heap_base
符号来获取堆的起始地址,而不必直接操作Heap_Mem
。这样做更具可读性,而且便于在不同的代码段中使用堆区域。