本帖最后由 hsrzq 于 2024-8-7 18:12 编辑
.mem文件文件本身就带详细说明,我觉得不用再解释了呀
Internal RAM layout:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a| | | | | | | |
0x10:| | | | | | | | | | | | | | | | |
0x20:|T|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| |
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute
Stack starts at: 0x21 (sp set to 0x20) with 222 bytes available.
The largest spare internal RAM space starts at 0x9 with 23 bytes available.
Other memory:
Name Start End Size Max
---------------- -------- -------- -------- --------
PAGED EXT. RAM 0 256
EXTERNAL RAM 0x0001 0x1e76 7798 8192
ROM/EPROM/FLASH 0x0000 0x5136 20791 65535 复制代码
第二眼再看.map文件,你可以认为ASxxxx Linker为每一小节的起始,摘录一小段如下:
ASxxxx Linker V03.00/V05.40 + sdld, page 9.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
SSEG 00000021 000000DE = 222. bytes (REL,OVR)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
00000021 __start__stack main 复制代码
1. Hexadecimal [32-Bits]表示该段下的地址用32位十六进制表示
2. SSEG表示这是堆栈段(即Stack Segment)
3. 00000021是SSEG段的起始位置。因为栈只能在data/idata中分配,所以可以配合第一眼.mem看一下第0x20行第1列,正好是S起始位置,相符。
4. 000000DE是整个SSEG段的长度。起始位置0x21+0xde - 1 = 0xfe,再配合第一眼.mem看下S正好只到0xfe。(为什么要减1?因为0x21已经占了一个名额了)
5. 222. bytes是该段的总字节数,与000000DE是同一个意思
6. (REL,OVR)是该段的一些属性,略微有点复杂,不详说了
7. value下的00000021,这是在该段下分配的资源地址。根据所属段不同,资源可能是变量、常量、中断入口、函数入口等等
8. Global下的__start__stack,这是在该段下分配的资源名称。__start__stack是sdcc系统栈底变量(注意C语言中要用_start__stack,少一个下划线)
9. main是定义该资源的模块。
DSEG、SSEG、XSEG这些,你随便打开一个生成的ASM文件就能看到含义。
DSEG → internal ram data
SSEG → Stack segment in internal ram
XSEG → uninitialized external ram data