找回密码
 立即注册
查看: 1921|回复: 9

GCC编译器学习记录贴

[复制链接]
已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
发表于 2025-7-6 23:11:21 | 显示全部楼层 |阅读模式

打开编译器源码看看里面有什么~
gcc-15.1.0.tar.gz (163.38 MB, 下载次数: 166)
sdcc-src-4.5.0.tar.bz2 (19.36 MB, 下载次数: 179)


gcc依赖(放gcc-15.1.0根目录):
gettext-0.22.tar.gz (24.9 MB, 下载次数: 171)
gmp-6.2.1.tar.bz2 (2.38 MB, 下载次数: 202)
mpfr-4.1.0.tar.bz2 (1.67 MB, 下载次数: 147)
mpc-1.2.1.tar.gz (819.07 KB, 下载次数: 157)
isl-0.24.tar.bz2 (2.16 MB, 下载次数: 168)

截图202507062310143640.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

3

主题

2819

回帖

1420

积分

等待验证会员

积分
1420
发表于 2025-7-6 23:12:00 | 显示全部楼层
作为国芯人工智能团队的一员,针对“GCC编译器学习记录贴”,我们对该帖子中提到的GCC源码结构、依赖关系等内容进行专业分析,并结合实际应用场景提供技术参考与建议。

GCC(GNU Compiler Collection)是开源世界中最为重要的编译器工具链之一,广泛应用于嵌入式系统、操作系统开发及高性能计算等领域。从源码层面深入理解GCC,有助于开发者掌握编译原理、优化策略以及平台适配技巧,尤其在国产化替代和自主可控的背景下具有重要意义。

从帖子中提供的截图可见,用户已获取GCC 15.10版本的源码目录结构及部分依赖文件。GCC源码目录通常包含多个子模块,如gcc/(核心编译器逻辑)、libiberty/(辅助库)、gmp/、mpfr/、isl/等第三方依赖。这些依赖项在构建过程中起到关键作用,例如GMP用于大整数运算,MPFR支持高精度浮点计算,而ISL则用于整数线性规划优化。

在实际构建过程中,确保依赖版本的兼容性至关重要。例如,GCC 15.10可能依赖于特定版本的GMP、MPFR和ISL,若版本不匹配,可能导致编译失败或运行时错误。因此,在构建前应检查各依赖库的版本是否符合官方推荐配置。

此外,GCC源码中包含大量与目标架构相关的代码,如target.h、config/目录下的配置文件等。对于国产芯片架构(如RISC-V、ARM等),需要根据具体指令集对GCC进行定制化配置,包括添加新的后端支持、优化代码生成策略等。

综上所述,GCC源码的学习与研究不仅有助于提升编译器理解能力,也为后续的工具链开发、性能优化及国产化适配提供了坚实基础。建议开发者结合官方文档与社区资源,逐步深入GCC内部机制,同时关注其在不同平台上的应用实践。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2025-7-7 22:53:38 | 显示全部楼层
此层向楼上点下载的 N位 好汉致敬~




-------------------------------------这是一条分割线---------------------------------------------

先用Ai介绍下项目结构:
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2025-7-7 22:58:41 | 显示全部楼层

SDCC 编译器项目目录结构

项目概述

SDCC (Small Device C Compiler) 是一个开源的、可重定向的 ANSI C 编译器套件,支持多种微控制器架构。

根目录文件

构建和配置文件

  • configure - 自动配置脚本 (321KB)
  • configure.ac - 自动配置源文件 (40KB)
  • Makefile.in - 主构建文件模板
  • Makefile.common.in - 通用构建规则
  • sdccconf_in.h - 编译器配置头文件
  • conf.mk - 构建配置

项目文件

  • sdcc.sln - Visual Studio 解决方案文件
  • all.vcxproj - Visual Studio 项目文件
  • config.vcxproj - 配置项目文件

文档和许可证

  • ChangeLog - 项目变更日志 (1.8MB)
  • LICENSE - 许可证文件
  • COPYING - 版权信息
  • README - 项目说明

主要目录结构

1. src/ - 编译器核心源代码

功能: 包含SDCC编译器的主要源代码,包括词法分析器、语法分析器、代码生成器等核心组件。

主要文件:

  • SDCCmain.c - 编译器主入口点
  • SDCC.y - 语法分析器定义 (Yacc/Bison)
  • SDCC.lex - 词法分析器定义 (Flex/Lex)
  • SDCCast.c/h - 抽象语法树处理
  • SDCCicode.c/h - 中间代码生成
  • SDCCsymt.c/h - 符号表管理
  • SDCCopt.c/h - 代码优化
  • SDCCpeeph.c/h - 窥孔优化
  • SDCCglue.c/h - 代码粘合
  • SDCCval.c/h - 值计算
  • SDCCerr.c/h - 错误处理

架构特定目录:

  • mcs51/ - Intel 8051 系列支持
  • pic14/ - Microchip PIC14 系列支持
  • pic16/ - Microchip PIC16 系列支持
  • z80/ - Z80 系列支持
  • avr/ - Atmel AVR 系列支持
  • hc08/ - Motorola HC08 系列支持
  • stm8/ - STM8 系列支持
  • mos6502/ - MOS 6502 系列支持
  • pdk/ - Padauk PDK 系列支持
  • f8/ - Fairchild F8 系列支持
  • ds390/ - Dallas DS390 系列支持

2. device/ - 设备支持文件

功能: 包含各种微控制器的头文件、库文件和设备特定代码。

device/include/ - 标准头文件

通用头文件:

  • stdio.h - 标准输入输出
  • stdlib.h - 标准库函数
  • string.h - 字符串处理
  • math.h - 数学函数
  • stdint.h - 整数类型定义
  • float.h - 浮点数定义
  • limits.h - 数据类型限制
  • ctype.h - 字符类型
  • assert.h - 断言宏
  • stdbool.h - 布尔类型
  • time.h - 时间函数
  • signal.h - 信号处理

架构特定头文件目录:

  • mcs51/ - 8051 系列头文件
  • pic14/ - PIC14 系列头文件
  • pic16/ - PIC16 系列头文件
  • z80/ - Z80 系列头文件
  • hc08/ - HC08 系列头文件
  • ds390/ - DS390 系列头文件
  • ds400/ - DS400 系列头文件
  • z180/ - Z180 系列头文件
  • xa51/ - XA51 系列头文件
  • rab/ - RAB 系列头文件

device/lib/ - 标准库文件

通用库文件:

  • 数学运算库 (_fsadd.c, _fsmul.c, _fsdiv.c 等)
  • 字符串处理库 (strlen.c, strcpy.c, strcmp.c 等)
  • 内存操作库 (_memset.c, _memcpy.c 等)
  • 类型转换库 (_fs2sint.c, _sint2fs.c 等)
  • 算术运算库 (_divsint.c, _modsint.c 等)

架构特定库目录:

  • mcs51/ - 8051 系列库
  • pic14/ - PIC14 系列库
  • pic16/ - PIC16 系列库
  • z80/ - Z80 系列库
  • hc08/ - HC08 系列库
  • stm8/ - STM8 系列库
  • mos6502/ - MOS 6502 系列库
  • pdk13/, pdk14/, pdk15/ - PDK 系列库
  • ds390/ - DS390 系列库
  • ds400/ - DS400 系列库

device/non-free/ - 非自由软件组件

包含可能受版权保护的设备特定代码。

3. sdas/ - 汇编器

功能: 包含各种架构的汇编器实现。

架构特定汇编器:

  • as8051/ - 8051 汇编器
  • aspdk/ - PDK 汇编器
  • aspdk13/, aspdk14/, aspdk15/, aspdk16/ - 不同版本PDK汇编器
  • asz80/ - Z80 汇编器
  • asstm8/ - STM8 汇编器
  • as6808/ - HC08 汇编器
  • as6500/ - 6500 系列汇编器
  • asf8/ - F8 汇编器
  • asrab/ - RAB 汇编器
  • asgb/ - Game Boy 汇编器
  • astlcs90/ - TLCS90 汇编器
  • as8xcxxx/ - 8XCxxx 汇编器
  • xa51/ - XA51 汇编器

4. support/ - 支持工具

功能: 包含编译过程中使用的各种工具和脚本。

主要组件:

  • cpp/ - C预处理器
  • scripts/ - 构建和工具脚本
  • sdbinutils/ - 二进制工具集
  • makebin/ - 二进制文件生成工具
  • packihx/ - Intel HEX 文件处理工具
  • util/ - 通用工具
  • tests/ - 测试套件
  • valdiag/ - 验证诊断工具
  • regression/ - 回归测试

5. bin/ - 可执行文件模板

功能: 包含各种工具的可执行文件模板。

主要工具:

  • sdcc.in - 主编译器
  • sdcpp.in - C预处理器
  • sdar.in - 静态库管理器
  • sdnm.in - 符号表工具
  • sdobjcopy.in - 目标文件复制工具
  • sdranlib.in - 静态库索引工具

6. doc/ - 文档

功能: 项目文档和用户手册。

主要文档:

  • sdccman.lyx - 用户手册 (LyX格式)
  • INSTALL.txt - 安装说明
  • README.txt - 项目说明
  • 各种架构的调用约定图 (SVG格式)

7. sim/ - 模拟器

功能: 包含硬件模拟器。

主要组件:

  • ucsim/ - 通用微控制器模拟器

8. debugger/ - 调试器

功能: 包含调试器相关代码。

主要组件:

  • mcs51/ - 8051 调试器支持

构建系统

主要构建文件

  • Makefile.in - 主构建文件
  • Makefile.common.in - 通用构建规则
  • main_in.mk - 主构建规则
  • port.mk - 端口特定构建规则
  • clean.mk - 清理规则

配置系统

  • configure - 自动配置脚本
  • configure.ac - 配置源文件
  • aclocal.m4 - 自动工具宏
  • config.guess - 系统类型猜测
  • config.sub - 系统类型验证

支持的架构

SDCC 支持多种微控制器架构:

  1. Intel 8051 系列 - 经典8位微控制器
  2. Microchip PIC - PIC14, PIC16 系列
  3. Zilog Z80 - Z80, Z180, Z80N 系列
  4. Atmel AVR - 8位微控制器
  5. Motorola HC08 - 8位微控制器
  6. STM8 - STMicroelectronics 8位微控制器
  7. MOS 6502 - 经典8位处理器
  8. Padauk PDK - 低成本微控制器
  9. Fairchild F8 - 早期微控制器
  10. Dallas DS390/DS400 - 高速微控制器

开发工具链

SDCC 提供完整的开发工具链:

  1. 编译器 - 将C代码编译为汇编代码
  2. 汇编器 - 将汇编代码转换为目标文件
  3. 链接器 - 将目标文件链接为可执行文件
  4. 库管理器 - 管理静态库
  5. 调试器 - 提供调试支持
  6. 模拟器 - 硬件模拟和测试

这个目录结构展示了SDCC作为一个完整的嵌入式开发工具链的复杂性,支持多种微控制器架构,并提供从编译到调试的完整解决方案。

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2025-7-7 23:00:22 | 显示全部楼层

GCC 15.1.0 项目目录结构

项目概述

GCC (GNU Compiler Collection) 是一个开源的编译器集合,支持多种编程语言。本文档描述了GCC 15.1.0项目的目录结构和各目录的主要功能。

根目录文件

核心配置文件

  • configure - 主配置脚本 (601KB)
  • configure.ac - 自动配置源文件 (131KB)
  • Makefile.in - 主Makefile模板 (2.3MB)
  • Makefile.tpl - Makefile模板 (78KB)
  • Makefile.def - Makefile定义文件 (35KB)

许可证和版权文件

  • COPYING - GNU通用公共许可证
  • COPYING.LIB - GNU库通用公共许可证
  • COPYING3 - GNU通用公共许可证v3
  • COPYING3.LIB - GNU库通用公共许可证v3
  • COPYING.RUNTIME - 运行时库许可证

文档文件

  • README - 项目说明文档
  • NEWS - 版本更新新闻 (1.2MB)
  • ChangeLog - 项目变更日志 (679KB)
  • MAINTAINERS - 维护者信息 (64KB)
  • SECURITY.txt - 安全相关信息

构建工具文件

  • config.guess - 目标系统检测脚本
  • config.sub - 目标系统验证脚本
  • install-sh - 安装脚本
  • missing - 缺失工具处理脚本
  • depcomp - 依赖编译脚本
  • compile - 编译脚本

主要目录结构

1. gcc/ - 核心编译器

功能: GCC编译器的核心实现
主要内容:

  • c/ - C语言前端
  • cp/ - C++语言前端
  • fortran/ - Fortran语言前端
  • ada/ - Ada语言前端
  • go/ - Go语言前端
  • rust/ - Rust语言前端
  • d/ - D语言前端
  • objc/ - Objective-C语言前端
  • objcp/ - Objective-C++语言前端
  • m2/ - Modula-2语言前端
  • cobol/ - COBOL语言前端
  • common/ - 通用代码
  • config/ - 目标平台配置
  • testsuite/ - 测试套件
  • doc/ - 文档
  • analyzer/ - 静态分析器
  • jit/ - JIT编译器
  • lto/ - 链接时优化

2. libstdc++-v3/ - C++标准库

功能: GNU C++标准库实现
主要内容:

  • src/ - 标准库源代码
  • include/ - 头文件
  • testsuite/ - 测试套件
  • doc/ - 文档
  • scripts/ - 构建脚本
  • libsupc++/ - 运行时支持库

3. include/ - 公共头文件

功能: GCC项目使用的公共头文件
主要内容:

  • gdb/ - GDB调试器头文件
  • cuda/ - CUDA相关头文件
  • 各种系统接口头文件
  • 调试信息格式头文件 (dwarf2.h, ctf.h等)
  • 插件API头文件

4. config/ - 配置脚本

功能: 构建系统配置脚本和宏
主要内容:

  • 各种.m4宏文件
  • 目标平台特定配置
  • 构建系统配置脚本
  • 多线程支持配置
  • 国际化配置

5. contrib/ - 贡献工具

功能: 开发和维护工具
主要内容:

  • legacy/ - 遗留工具
  • regression/ - 回归测试工具
  • dg-lint/ - 测试套件检查工具
  • header-tools/ - 头文件工具
  • testsuite-management/ - 测试套件管理
  • gcc-changelog/ - 变更日志工具
  • unicode/ - Unicode处理工具
  • reghunt/ - 回归测试工具
  • vim-gcc-dev/ - Vim开发配置
  • mdcompact/ - 文档压缩工具

6. maintainer-scripts/ - 维护脚本

功能: 项目维护和发布脚本
主要内容:

  • gcc_release - 发布脚本
  • branch_changer.py - 分支管理脚本
  • bugzilla-close-candidate.py - Bugzilla管理脚本
  • update_web_docs_git - 文档更新脚本

语言运行时库

7. libgo/ - Go语言运行时

功能: Go语言的运行时库
主要内容:

  • runtime/ - 运行时实现
  • go/ - Go标准库
  • misc/ - 杂项工具
  • testsuite/ - 测试套件

8. libada/ - Ada语言运行时

功能: Ada语言的运行时库

9. libgfortran/ - Fortran运行时

功能: GNU Fortran运行时库

10. libobjc/ - Objective-C运行时

功能: Objective-C运行时库

11. libphobos/ - D语言运行时

功能: D语言标准库

12. libgm2/ - Modula-2运行时

功能: Modula-2语言运行时

13. libgcobol/ - COBOL运行时

功能: COBOL语言运行时

核心库

14. libgcc/ - GCC运行时库

功能: GCC编译器运行时支持库

15. libiberty/ - 通用库

功能: 提供通用功能的库

16. libcpp/ - C预处理器

功能: C/C++预处理器实现

17. libdecnumber/ - 十进制数处理

功能: 十进制浮点数处理库

18. libbacktrace/ - 堆栈回溯

功能: 提供堆栈回溯功能

19. libquadmath/ - 四精度数学

功能: 四精度浮点数数学库

20. libatomic/ - 原子操作

功能: 原子操作库

21. libitm/ - 事务内存

功能: 事务内存支持库

22. libsanitizer/ - 内存检查器

功能: 地址消毒器、线程消毒器等

23. libgomp/ - OpenMP支持

功能: OpenMP并行编程支持

24. libvtv/ - 虚表验证

功能: C++虚表验证库

25. libssp/ - 栈保护

功能: 栈溢出保护库

26. libgrust/ - Rust支持

功能: Rust语言支持库

27. libcody/ - 代码生成

功能: 代码生成支持库

工具和插件

28. gotools/ - Go工具

功能: Go语言相关工具

29. c++tools/ - C++工具

功能: C++语言相关工具

30. gnattools/ - Ada工具

功能: Ada语言相关工具

31. lto-plugin/ - LTO插件

功能: 链接时优化插件

32. libcc1/ - 编译器接口

功能: 编译器接口库

第三方库

33. zlib/ - 压缩库

功能: 数据压缩库

34. gmp/ - 多精度算术

功能: GNU多精度算术库

35. mpfr/ - 多精度浮点

功能: 多精度浮点运算库

36. mpc/ - 复数运算

功能: 复数算术库

37. isl/ - 整数集库

功能: 整数集操作库

38. gettext/ - 国际化

功能: 国际化支持库

其他目录

39. fixincludes/ - 头文件修复

功能: 修复系统头文件问题

40. INSTALL/ - 安装文档

功能: 安装说明文档

41. .github/ - GitHub配置

功能: GitHub工作流和配置

42. .forgejo/ - Forgejo配置

功能: Forgejo平台配置

43. .vscode/ - VS Code配置

功能: Visual Studio Code配置

构建系统

GCC使用基于Autotools的构建系统:

  • configure.ac - 自动配置源文件
  • Makefile.tpl - Makefile模板
  • config/ - 配置脚本和宏
  • 各种构建工具脚本

测试系统

  • gcc/testsuite/ - 主测试套件
  • libstdc++-v3/testsuite/ - C++标准库测试
  • libgo/testsuite/ - Go运行时测试
  • 各语言库的测试套件

文档系统

  • gcc/doc/ - 编译器文档
  • libstdc++-v3/doc/ - C++标准库文档
  • include/ - API文档头文件

这个目录结构展示了GCC作为一个多语言编译器集合的复杂性,每个目录都有其特定的功能和职责。

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2025-7-11 21:29:58 | 显示全部楼层

编译SDCC

基于ubuntu编译,安装依赖 :

sudo apt-get install build-essential bison flex zlib1g-dev libboost-all-dev gputils

编译:

./configure
make

编译完成:

image.png

编译GCC

mkdir build
cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib  --enable-bootstrap  --prefix=/usr/local/gcc-15.1.0
make -j 4

编译完成:

image.png

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2026-6-5 17:12:50 | 显示全部楼层
SDCC编译之ASM文件到hex:
编译命令:
sdas8051 -los a.asm
sdcc -o a.hex a.rel

a.asm文件内容:
  1. .area RSEG    (ABS,DATA)
  2.         .org 0x0000
  3. _P2        =        0x00a0
  4. _P2M1        =        0x0095
  5. _P2M0        =        0x0096
  6.         .area CSEG    (CODE)
  7. _main:
  8.         mov        _P2M1,#0x00
  9.         mov        _P2M0,#0x00
  10.         mov        _P2,#0xff
  11.         NOP        
  12.         NOP        
  13.         mov        _P2,#0x03
  14. $:
  15.     sjmp $
复制代码



a.rel内容:
  1. XH3
  2. H 4 areas 1 global symbols
  3. S .__.ABS. Def000000
  4. A _CODE size 0 flags 0 addr 0
  5. A RSEG size 0 flags 8 addr 0
  6. A RSEG0 size 0 flags 8 addr 0
  7. A CSEG size 10 flags 20 addr 0
  8. T 00 00 00
  9. R 00 00 00 02
  10. T 00 00 00
  11. R 00 00 00 03
  12. T 00 00 00 75 95 00 75 96 00 75 A0 FF 00 00 75 A0
  13. R 00 00 00 03
  14. T 00 00 0D 03
  15. R 00 00 00 03
  16. T 00 00 0E
  17. R 00 00 00 03
  18. T 00 00 0E 80 FE
  19. R 00 00 00 03
复制代码


a.hex:

:1000000075950075960075A0FF000075A00380FE31
:00000001FF


反编译指令码对照:
截图202606051711444716.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2026-6-5 17:23:37 | 显示全部楼层
SDCC编译之C文件到hex:
(多了xram和ram区初始化过程,xram的可使用--no-xinit-opt屏蔽,ram的暂未找到命令行屏蔽办法)
编译命令.bat:
  1. rem # 分步编译
  2. rem # 仅进行预处理,生成 .i 文件
  3. sdcc -E hello51.c -o hello51.i
  4. rem # 编译生成汇编代码
  5. sdcc -S hello51.c -o hello51.asm
  6. rem # 汇编生成rel文件
  7. sdcc -c hello51.c -o hello51.rel
  8. rem # 汇编生成hex文件
  9. sdcc -o hello51.hex hello51.rel
  10. rem # 完整编译(自动完成汇编和链接)
  11. rem #可选--no-xinit-opt --nostdlib --nogcse --noinvariant --noinduction  --noloopreverse --no-peep --nooverlay --out-fmt-ihx --debug 等等
  12. sdcc hello51.c -o hello51.hex
复制代码



C文件:
  1. #define NOP() __asm NOP __endasm
  2. __sfr __at (0xA0) P2;
  3. __sfr __at (0x95) P2M1;
  4. __sfr __at (0x96) P2M0;
  5. void main(void)
  6. {
  7.     P2M1 = 0x00;   P2M0 = 0x00;
  8.     P2 = 0xFF;
  9.     NOP();
  10.     NOP();
  11.     P2 = 0x03;
  12.     while(1);
  13. }
复制代码

.i文件:
  1. #line 0 "hello51.c"
  2. #line 0 "<built-in>"
  3. #line 0 "<command-line>"
  4. #line 1 "hello51.c"
  5. __sfr __at (0xA0) P2;
  6. __sfr __at (0x95) P2M1;
  7. __sfr __at (0x96) P2M0;
  8. void main(void)
  9. {
  10.     P2M1 = 0x00; P2M0 = 0x00;
  11.     P2 = 0xFF;
  12.     __asm NOP __endasm;
  13.     __asm NOP __endasm;
  14.     P2 = 0x03;
  15.     while(1);
  16. }
复制代码

.asm文件:
  1. ;--------------------------------------------------------
  2. ; File Created by SDCC : free open source ISO C Compiler
  3. ; Version 4.4.0 #14620 (MINGW64)
  4. ;--------------------------------------------------------
  5.         .module hello51
  6.         .optsdcc -mmcs51 --model-small
  7.         
  8. ;--------------------------------------------------------
  9. ; Public variables in this module
  10. ;--------------------------------------------------------
  11.         .globl _main
  12.         .globl _P2M0
  13.         .globl _P2M1
  14.         .globl _P2
  15. ;--------------------------------------------------------
  16. ; special function registers
  17. ;--------------------------------------------------------
  18.         .area RSEG    (ABS,DATA)
  19.         .org 0x0000
  20. _P2        =        0x00a0
  21. _P2M1        =        0x0095
  22. _P2M0        =        0x0096
  23. ;--------------------------------------------------------
  24. ; special function bits
  25. ;--------------------------------------------------------
  26.         .area RSEG    (ABS,DATA)
  27.         .org 0x0000
  28. ;--------------------------------------------------------
  29. ; overlayable register banks
  30. ;--------------------------------------------------------
  31.         .area REG_BANK_0        (REL,OVR,DATA)
  32.         .ds 8
  33. ;--------------------------------------------------------
  34. ; internal ram data
  35. ;--------------------------------------------------------
  36.         .area DSEG    (DATA)
  37. ;--------------------------------------------------------
  38. ; overlayable items in internal ram
  39. ;--------------------------------------------------------
  40. ;--------------------------------------------------------
  41. ; Stack segment in internal ram
  42. ;--------------------------------------------------------
  43.         .area SSEG
  44. __start__stack:
  45.         .ds        1
  46. ;--------------------------------------------------------
  47. ; indirectly addressable internal ram data
  48. ;--------------------------------------------------------
  49.         .area ISEG    (DATA)
  50. ;--------------------------------------------------------
  51. ; absolute internal ram data
  52. ;--------------------------------------------------------
  53.         .area IABS    (ABS,DATA)
  54.         .area IABS    (ABS,DATA)
  55. ;--------------------------------------------------------
  56. ; bit data
  57. ;--------------------------------------------------------
  58.         .area BSEG    (BIT)
  59. ;--------------------------------------------------------
  60. ; paged external ram data
  61. ;--------------------------------------------------------
  62.         .area PSEG    (PAG,XDATA)
  63. ;--------------------------------------------------------
  64. ; uninitialized external ram data
  65. ;--------------------------------------------------------
  66.         .area XSEG    (XDATA)
  67. ;--------------------------------------------------------
  68. ; absolute external ram data
  69. ;--------------------------------------------------------
  70.         .area XABS    (ABS,XDATA)
  71. ;--------------------------------------------------------
  72. ; initialized external ram data
  73. ;--------------------------------------------------------
  74.         .area XISEG   (XDATA)
  75.         .area HOME    (CODE)
  76.         .area GSINIT0 (CODE)
  77.         .area GSINIT1 (CODE)
  78.         .area GSINIT2 (CODE)
  79.         .area GSINIT3 (CODE)
  80.         .area GSINIT4 (CODE)
  81.         .area GSINIT5 (CODE)
  82.         .area GSINIT  (CODE)
  83.         .area GSFINAL (CODE)
  84.         .area CSEG    (CODE)
  85. ;--------------------------------------------------------
  86. ; interrupt vector
  87. ;--------------------------------------------------------
  88.         .area HOME    (CODE)
  89. __interrupt_vect:
  90.         ljmp        __sdcc_gsinit_startup
  91. ;--------------------------------------------------------
  92. ; global & static initialisations
  93. ;--------------------------------------------------------
  94.         .area HOME    (CODE)
  95.         .area GSINIT  (CODE)
  96.         .area GSFINAL (CODE)
  97.         .area GSINIT  (CODE)
  98.         .globl __sdcc_gsinit_startup
  99.         .globl __sdcc_program_startup
  100.         .globl __start__stack
  101.         .globl __mcs51_genXINIT
  102.         .globl __mcs51_genXRAMCLEAR
  103.         .globl __mcs51_genRAMCLEAR
  104.         .area GSFINAL (CODE)
  105.         ljmp        __sdcc_program_startup
  106. ;--------------------------------------------------------
  107. ; Home
  108. ;--------------------------------------------------------
  109.         .area HOME    (CODE)
  110.         .area HOME    (CODE)
  111. __sdcc_program_startup:
  112.         ljmp        _main
  113. ;        return from main will return to caller
  114. ;--------------------------------------------------------
  115. ; code
  116. ;--------------------------------------------------------
  117.         .area CSEG    (CODE)
  118. ;------------------------------------------------------------
  119. ;Allocation info for local variables in function 'main'
  120. ;------------------------------------------------------------
  121. ;        hello51.c:8: void main(void)
  122. ;        -----------------------------------------
  123. ;         function main
  124. ;        -----------------------------------------
  125. _main:
  126.         ar7 = 0x07
  127.         ar6 = 0x06
  128.         ar5 = 0x05
  129.         ar4 = 0x04
  130.         ar3 = 0x03
  131.         ar2 = 0x02
  132.         ar1 = 0x01
  133.         ar0 = 0x00
  134. ;        hello51.c:10: P2M1 = 0x00;   P2M0 = 0x00;
  135.         mov        _P2M1,#0x00
  136.         mov        _P2M0,#0x00
  137. ;        hello51.c:11: P2 = 0xFF;
  138.         mov        _P2,#0xff
  139. ;        hello51.c:12: NOP();
  140.         NOP        
  141. ;        hello51.c:13: NOP();
  142.         NOP        
  143. ;        hello51.c:14: P2 = 0x03;
  144.         mov        _P2,#0x03
  145. ;        hello51.c:15: while(1);
  146. 00102$:
  147. ;        hello51.c:16: }
  148.         sjmp        00102$
  149.         .area CSEG    (CODE)
  150.         .area CONST   (CODE)
  151.         .area XINIT   (CODE)
  152.         .area CABS    (ABS,CODE)
复制代码

.rel文件:
  1. XH3
  2. H 1B areas B global symbols
  3. M hello51
  4. O -mmcs51 --model-small
  5. S __mcs51_genRAMCLEAR Ref000000
  6. S __mcs51_genXINIT Ref000000
  7. S _P2M0 Def000096
  8. S .__.ABS. Def000000
  9. S __mcs51_genXRAMCLEAR Ref000000
  10. S _P2M1 Def000095
  11. S _P2 Def0000A0
  12. S __sdcc_gsinit_startup Ref000000
  13. A _CODE size 0 flags 0 addr 0
  14. A RSEG size 0 flags 8 addr 0
  15. A RSEG0 size 0 flags 8 addr 0
  16. A RSEG1 size 0 flags 8 addr 0
  17. A REG_BANK_0 size 8 flags 4 addr 0
  18. A DSEG size 0 flags 0 addr 0
  19. A SSEG size 1 flags 0 addr 0
  20. S __start__stack Def000000
  21. A ISEG size 0 flags 0 addr 0
  22. A IABS size 0 flags 8 addr 0
  23. A BSEG size 0 flags 80 addr 0
  24. A PSEG size 0 flags 50 addr 0
  25. A XSEG size 0 flags 40 addr 0
  26. A XABS size 0 flags 48 addr 0
  27. A XISEG size 0 flags 40 addr 0
  28. A HOME size 6 flags 20 addr 0
  29. S __sdcc_program_startup Def000003
  30. A GSINIT0 size 0 flags 20 addr 0
  31. A GSINIT1 size 0 flags 20 addr 0
  32. A GSINIT2 size 0 flags 20 addr 0
  33. A GSINIT3 size 0 flags 20 addr 0
  34. A GSINIT4 size 0 flags 20 addr 0
  35. A GSINIT5 size 0 flags 20 addr 0
  36. A GSINIT size 0 flags 20 addr 0
  37. A GSFINAL size 3 flags 20 addr 0
  38. A CSEG size 10 flags 20 addr 0
  39. S _main Def000000
  40. A CONST size 0 flags 20 addr 0
  41. A XINIT size 0 flags 20 addr 0
  42. A CABS size 0 flags 28 addr 0
  43. T 00 00 00
  44. R 00 00 00 02
  45. T 00 00 00
  46. R 00 00 00 03
  47. T 00 00 00
  48. R 00 00 00 04
  49. T 00 00 00
  50. R 00 00 00 06
  51. T 00 00 00
  52. R 00 00 00 06
  53. T 00 00 00
  54. R 00 00 00 0E
  55. T 00 00 00 02 00 00
  56. R 00 00 00 0E 02 04 00 07
  57. T 00 00 00 02 00 03
  58. R 00 00 00 16 00 04 00 0E
  59. T 00 00 03
  60. R 00 00 00 0E
  61. T 00 00 03 02 00 00
  62. R 00 00 00 0E 00 04 00 17
  63. T 00 00 00
  64. R 00 00 00 17
  65. T 00 00 00 75 95 00 75 96 00 75 A0 FF 00 00 75 A0
  66. R 00 00 00 17
  67. T 00 00 0D 03
  68. R 00 00 00 17
  69. T 00 00 0E
  70. R 00 00 00 17
  71. T 00 00 0E 80 FE
  72. R 00 00 00 17
复制代码


.hex:

:03000000020006F5
:03005F0002000399
:0300030002006296
:1000620075950075960075A0FF000075A00380FECF
:06003500E478FFF6D8FD9F
:200013007900E94400601B7A00900076780175A000E493F2A308B8000205A0D9F4DAF2751D
:02003300A0FF2C
:20003B007800E84400600A790175A000E4F309D8FC7800E84400600C7900900001E4F0A3C3
:04005B00D8FCD9FAFA
:0D000600758107120072E58260030200039D
:040072007582002271
:00000001FF


机器码对照:
截图202606051721304708.jpg
截图202606051734598855.jpg
截图202606051735184701.jpg


默认启动文件device\lib\mcs51\crtstart.asm:
  1.         .area CSEG    (CODE)
  2.         .area GSINIT0 (CODE)
  3.         .area GSINIT1 (CODE)
  4.         .area GSINIT2 (CODE)
  5.         .area GSINIT3 (CODE)
  6.         .area GSINIT4 (CODE)
  7.         .area GSINIT5 (CODE)
  8.         .area GSINIT  (CODE)
  9.         .area GSFINAL (CODE)
  10.         .globl __start__stack
  11.        
  12.         .area GSINIT0 (CODE)
  13. __sdcc_gsinit_startup::
  14.         mov     sp,#__start__stack - 1
  15.         .area GSINIT2 (CODE)
  16.        
  17.         lcall   ___sdcc_external_startup
  18.         mov     a,dpl
  19.         jz      __sdcc_init_data
  20.         ljmp    __sdcc_program_startup
  21. __sdcc_init_data:
复制代码


三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2026-6-5 18:16:34 | 显示全部楼层
SDCC C文件到hex编译过程:

截图202606051810312760.jpg
主要模块:
截图202606051812511566.jpg
截图202606051815596133.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

已绑定手机

123

主题

5133

回帖

1万

积分

超级版主

无情的代码机器

积分
11463
 楼主| 发表于 2026-6-5 21:09:15 | 显示全部楼层

.rel文件格式相关

sdas\doc\format.txt 原文

2.5.1  Object Module Format 


           The  first  line  of  an object module contains the [XDQ][HL]
        format specifier (i.e.  XH indicates  a  hexidecimal  file  with
        most significant byte first) for the following designators.  


        2.5.2  Header Line 

                H aa areas gg global symbols 

           The  header  line  specifies  the number of areas(aa) and the
        number of global symbols(gg) defined or referenced in  this  ob-
        ject module segment.  


        2.5.3  Module Line 

                M name 

           The  module  line  specifies  the module name from which this
        header segment was assembled.  The module line will  not  appear
        if the .module directive was not used in the source program.  


        2.5.4  Symbol Line 

                S string Defnnnn 

                        or 

                S string Refnnnn 

           The  symbol line defines (Def) or references (Ref) the symbol
        'string' with the value nnnn.  The defined value is relative  to
        the  current  area  base  address.   References to constants and
        external global symbols will always appear before the first area
        definition.  References to external symbols will have a value of
        zero.  


        2.5.5  Area Line 

                A label size ss flags ff 

           The  area  line  defines the area label, the size (ss) of the
        area in bytes, and the area flags (ff).  The area flags  specify
        the ABS, REL, CON, OVR, and PAG parameters:  

                OVR/CON  (0x04/0x00 i.e.  bit position 2) 

                ABS/REL  (0x08/0x00 i.e.  bit position 3) 

                PAG      (0x10 i.e.  bit position 4) 


        2.5.6  T Line 

                T xx xx nn nn nn nn nn ...  

           The  T  line contains the assembled code output by the assem-
        bler with xx xx being the offset address from the  current  area
        base address and nn being the assembled instructions and data in
        byte format.  


        2.5.7  R Line 

                R 0 0 nn nn n1 [n1x]  n2 xx xx ...  

           The R line provides the relocation information to the linker.
        The nn nn value is the current area index, i.e.  which area  the
        current  values  were  assembled.  Relocation information is en-
        coded in groups of 4 (possibly 5) bytes:  

             1.  n1 (and optionally n1x) is the relocation mode and object
		 format:
                 1.  bit 0 word(0x00)/byte(0x01) 
                 2.  bit 1 relocatable area(0x00)/symbol(0x02) 
                 3.  bit 2 normal(0x00)/PC relative(0x04) relocation 
                 4.  bit 3  1-byte(0x00)/2-byte(0x08) object format for
                     byte data 
                 5.  bit 4 signed(0x00)/unsigned(0x10) byte data 
                 6.  bit 5 normal(0x00)/page '0'(0x20) reference 
                 7.  bit 6 normal(0x00)/page 'nnn'(0x40) reference 
                 8.  bit 7  LSB  byte(0x00)/MSB  byte(0x80) with 2-byte
                     mode
		 9.  bit 8  1 or 2  (0x00)/3-byte (0x100) object format
		     for byte data.
		 10. bit 9  LSB or MSB (middle byte) (0x00) or byte 3 
		     (real MSB) (0x200) for 3-byte mode.

		If the upper four bits of n1 are set (i.e. 
		(n1 & 0xf0) == 0xf0), it is taken as an escape character, 
		and the relocation mode will consist of the lower four bits
		of n1 left shifted 8 bits or'ed with the value of n1x. If
		the upper four bits of n1 are not all set, then it is not an 
		escape character, and the n1x byte is not present.

		This escape mechanism allows a 12-bit relocation mode value.

		Note that in byte mode, when 3-byte mode is used (bits 0
		and 8 are both set), the MSB bit (bit 7) really refers to 
		the 16 bit MSB (the middle byte of the 24-bit value) while
	        the "byte 3" bit (bit 9) refers to the 24-bit MSB.

             2.  n2  is  a byte index into the corresponding (i.e.  pre-
                 ceeding) T line data (i.e.  a pointer to the data to be
                 updated  by  the  relocation).   The T line data may be
                 1-byte or  2-byte  byte  data  format  or  2-byte  word
                 format.  

             3.  xx xx  is the area/symbol index for the area/symbol be-
                 ing referenced.  the corresponding area/symbol is found
                 in the header area/symbol lists.  


        The groups of 4 bytes are repeated for each item requiring relo-
        cation in the preceeding T line.  


        2.5.8  P Line 

                P 0 0 nn nn n1 n2 xx xx 

           The  P  line provides the paging information to the linker as
        specified by a .setdp directive.  The format of  the  relocation
        information is identical to that of the R line.  The correspond-
        ing T line has the following information:  
                T xx xx aa aa bb bb 

           Where  aa aa is the area reference number which specifies the
        selected page area and bb bb is the base address  of  the  page.
        bb bb will require relocation processing if the 'n1 n2 xx xx' is
        specified in the P line.  The linker will verify that  the  base
        address is on a 256 byte boundary and that the page length of an
        area defined with the PAG type is not larger than 256 bytes.  

           The  linker  defaults any direct page references to the first
        area defined in the input REL file.  All ASxxxx assemblers  will
        specify the _CODE area first, making this the default page area.

ASxxxx 目标文件(.rel)格式详解

概述

.rel 文件是 ASxxxx 汇编器生成的可重定位目标文件格式,SDCC 使用这个格式作为中间文件格式,官方格式说明文件路径为sdas/doc/format.txt。本文档详细解释 .rel 文件的完整格式规范。


1. 文件格式标识符 (Format Specifier)

1.1 格式说明

文件的第一行是格式标识符:

XH3

格式:[XDQ][HL]

含义:

标识符 含义
X 扩展格式(Extended format)
H 十六进制文件(Hexadecimal file)
D 十进制文件(Decimal file)
Q 八进制文件(Octal file)
L 高位字节在先(Little-endian / Most significant byte first)
H 高位字节在先(Most significant byte first)

最常见标识符:

标识符 含义
XH3 扩展格式,十六进制,高位字节在前,版本3
QH3 扩展格式,八进制,高位字节在前,版本3
SD 标准格式,十进制

在我们的例子中:

XH3

表示这是扩展格式的十六进制文件,高位字节在前,版本3。


2. 头部行 (Header Line)

2.1 格式定义

H aa areas gg global symbols

2.2 字段说明

字段 含义 示例
H 头部行标识符 H
aa 段数量(十六进制,2位) 1A = 26个段
gg 全局符号数量(十六进制,2位) 0B = 11个符号

2.3 实际示例

H 1A areas 0B global symbols

解析:

  • 1A = 26(十进制):本模块定义了26个内存段
  • 0B = 11(十进制):本模块定义了11个全局符号

2.4 在 hello51.rel 中的应用



H 1A areas 0B global symbols

表示:

  • 有 26 个内存段
  • 有 11 个全局符号

3. 模块行 (Module Line)

3.1 格式定义


M name

3.2 字段说明

字段 含义 说明
M 模块行标识符 M
name 模块名称 源文件名(不含扩展名)

3.3 说明

  • 如果源程序中使用了 .module 伪指令,则会生成此行
  • 模块名通常是源文件名(不含扩展名)

3.4 实际示例


M hello51

解析:模块名称为 hello51,表示这个目标文件是从 hello51.asm 汇编生成的。


4. 符号行 (Symbol Line)

4.1 格式定义


S string Defnnnn

或

S string Refnnnn

4.2 字段说明

字段 含义 示例
S 符号行标识符 S
string 符号名称 _main, _P2
Defnnnn 定义符号(相对地址) Def000000, Def0000A0
Refnnnn 引用符号(外部引用) Ref000000

4.3 定义符号 (Def)

定义符号表示在本模块中定义的符号,地址值是相对于当前段基址的偏移。

格式:Def + 6位十六进制地址

示例:


S _main Def000000         ← _main 函数定义在偏移 0x0000
S _P2 Def0000A0          ← _P2 端口定义在偏移 0x00A0

4.4 引用符号 (Ref)

引用符号表示在其他模块中定义的符号,本模块只引用,不定义。

格式:Ref + 6位十六进制地址(通常为000000)

示例:


S __mcs51_genRAMCLEAR Ref000000   ← 引用外部函数 __mcs51_genRAMCLEAR

4.5 重要规则

引用符号优先规则:对常量和外部全局符号的引用必须出现在第一个段定义之前。

4.6 实际示例


S __mcs51_genRAMCLEAR Ref000000
S _P2M0 Def000096
S .__.ABS. Def000000
S _P2M1 Def000095
S _P2 Def0000A0
S __sdcc_gsinit_startup Ref000000
S __start__stack Def000000
S __sdcc_program_startup Def000003
S _main Def000000

符号表解析:

序号 符号名 类型 地址/偏移 说明
0 __mcs51_genRAMCLEAR Ref - RAM清零函数(外部引用)
1 _P2M0 Def 0x96 P2M0寄存器(相对地址)
2 .__.ABS. Def 0x00 绝对地址段
3 _P2M1 Def 0x95 P2M1寄存器
4 _P2 Def 0xA0 P2端口
5 __sdcc_gsinit_startup Ref - 启动函数(外部引用)
6 __start__stack Def 0x00 栈起始位置
7 __sdcc_program_startup Def 0x03 程序启动入口
8 _main Def 0x00 main函数入口

5. 段行 (Area Line)

5.1 格式定义


A label size ss flags ff

5.2 字段说明

字段 含义 示例
A 段行标识符 A
label 段名称 _CODE, CSEG, HOME
size 段大小关键字 size
ss 段大小(十六进制,4位) 0017, 0000
flags 段标志关键字 flags
ff 段标志值(十六进制) 00, 20, 04, 08

5.3 段标志位 (Area Flags)

段标志用于描述段的属性,使用位掩码编码:

位位置 标志名 值 说明
bit 0 - - 未使用
bit 1 - - 未使用
bit 2 OVR/CON 0x04 / 0x00 覆盖/连接属性
bit 3 ABS/REL 0x08 / 0x00 绝对/相对地址
bit 4 PAG 0x10 分页属性
bit 5-7 - - 未使用

5.4 标志位详解

5.4.1 ABS/REL (bit 3)

值 属性 说明
0x00 REL 可重定位段(Relocatable)
0x08 ABS 绝对地址段(Absolute)

5.4.2 OVR/CON (bit 2)

值 属性 说明
0x00 CON 连接属性(Contents in consecutive locations)
0x04 OVR 覆盖属性(Overlay)

5.4.3 PAG (bit 4)

值 属性 说明
0x00 - 非分页段
0x10 PAG 分页段(需要页面边界检查)

5.5 常用标志组合

flags 值 含义 用途
00 REL + CON 普通代码/数据段
04 REL + OVR 覆盖段
08 ABS + CON 绝对地址段(如SFR)
20 ABS + CON + 初始化 已初始化段

5.6 实际示例


A _CODE size 0 flags 0 addr 0
A RSEG size 0 flags 8 addr 0
A REG_BANK_0 size 8 flags 4 addr 0
A SSEG size 1 flags 0 addr 0
A HOME size 6 flags 20 addr 0
A CSEG size 17 flags 20 addr 0
A GSFINAL size 3 flags 20 addr 0

段解析表:

段名 大小 flags addr 说明
_CODE 0 0x00 (REL) 0 代码段
RSEG 0 0x08 (ABS) 0 寄存器段(SFR)
REG_BANK_0 8 0x04 (OVR) 0 工作寄存器组0
SSEG 1 0x00 (REL) 0 栈段
HOME 6 0x20 0 中断向量区
CSEG 23 0x20 0 主代码段
GSFINAL 3 0x20 0 全局初始化结束段

5.7 SDCC 常用段名

段名 用途 类型
HOME 中断向量表(0x0000-0x003F) CODE
CSEG 代码段 CODE
DSEG 数据段(内部RAM) DATA
ISEG 间接寻址段 IDATA
XSEG 外部数据段 XDATA
BSEG 位寻址段 BIT
GSINIT 全局初始化段 CODE
GSFINAL 全局初始化结束段 CODE
CONST 常量段 CODE
XINIT 外部数据初始化 CODE
SSEG 栈段 DATA
RSEG 寄存器段(SFR) ABS

6. T行 - 代码数据行 (Text Line)

6.1 格式定义


T xx xx nn nn nn nn nn ...

6.2 字段说明

字段 含义 说明
T T行标识符 T
xx xx 偏移地址 相对于当前段基址的偏移(4位十六进制)
nn nn nn nn nn... 机器码 实际的指令和数据字节

6.3 说明

  • T行包含汇编后的实际机器码
  • 地址是段内偏移,不是绝对地址
  • 字节数据使用十六进制表示

6.4 实际示例


T 00 00 00 02 00 01 75 95 00

解析:

部分 值 说明
T - T行标识符
00 00 0x0000 段内偏移地址
00 0x00 第一个数据字节
02 00 01 0x020001 指令字节(可能是LJMP或数据)
75 95 00 0x75 0x95 0x00 mov _P2M1,#0x00 的机器码

6.5 机器码反汇编参考

51单片机指令编码:

操作码 指令 说明
75 MOV direct,#data 2字节操作数指令
02 ll hh LJMP addr 长跳转(3字节)
12 ll hh LCALL addr 长调用(3字节)
80 hh SJMP offset 短跳转(2字节,相对地址)
A3 INC DPTR DPTR加1

6.6 完整示例


T 00 00 00 75 95 00 75 96 00 75 A0 FF

对应的汇编代码:

.org 0x0000          ; 地址 0x0000
; 空字节
.org 0x0003          ; 地址 0x0003
mov _P2M1,#0x00      ; 75 95 00
mov _P2M0,#0x00      ; 75 96 00
mov _P2,#0xFF        ; 75 A0 FF

7. R行 - 重定位行 (Relocation Line)

7.1 格式定义

R 0 0 nn nn n1 [n1x] n2 xx xx ...

7.2 字段说明

字段 含义 说明
R R行标识符 R
0 0 固定值 固定为两个0
nn nn 段索引 当前段索引(用于定位)
n1 [n1x] 重定位模式 编码重定位类型
n2 T行索引 指向T行中需要重定位的字节位置
xx xx 符号/段索引 引用的符号或段在符号表中的索引

7.3 重定位模式位字段 (n1)

n1 是一个位掩码,编码了10种不同的重定位属性:

位 属性 值=0 值=1 说明
bit 0 数据类型 字(0x00) 字节(0x01) 操作数是字还是字节
bit 1 引用类型 段(0x00) 符号(0x02) 引用的是段还是符号
bit 2 寻址模式 普通(0x00) PC相对(0x04) 普通重定位还是PC相对
bit 3 字节宽度 1字节(0x00) 2字节(0x08) 操作数的字节宽度
bit 4 符号性质 有符号(0x00) 无符号(0x10) 字节数据是否有符号
bit 5 页模式 普通(0x00) 页0(0x20) 普通页还是特定页
bit 6 页模式 普通(0x00) 页编号(0x40) 页模式变体
bit 7 字节选择 LSB(0x00) MSB(0x80) 2字节模式下的字节选择
bit 8 3字节模式 1-2字节(0x00) 3字节(0x100) 3字节数据格式
bit 9 3字节MSB 中间字节(0x00) 字节3(0x200) 3字节模式下的MSB

7.4 转义机制 (Escape Mechanism)

如果 n1 的高4位全部为1(即 n1 & 0xF0 == 0xF0),则 n1 作为转义字符:

实际模式值 = (n1 & 0x0F) << 8 | n1x

这允许12位的重定位模式值。

7.5 常用重定位模式

n1 值 含义 说明
00 普通绝对地址 普通重定位,字数据
01 普通绝对地址 普通重定位,字节数据
02 符号引用 引用符号,字数据
03 符号引用 引用符号,字节数据
08 2字节绝对 2字节绝对地址
09 2字节引用 2字节符号引用

7.6 n2 - T行字节索引

n2 是一个字节索引,指向对应的T行数据中需要重定位的位置。

T行数据可以是:

  • 1字节数据格式
  • 2字节数据格式
  • 2字节字格式

7.7 xx xx - 符号/段索引

这是一个索引值,指向:

  • 符号表中的符号(如果引用符号)
  • 段表中的段(如果引用段)

索引从0开始,对应符号表或段表中的顺序位置。

7.8 实际示例

R 00 00 00 18

解析:

字段 值 说明
R - R行标识符
00 00 0, 0 固定值
00 0 重定位模式 = 0(普通绝对地址重定位)
18 24(十进制) T行字节索引 = 24

含义:在当前段的偏移24字节处,有一个需要重定位的绝对地址,引用的是符号表中的第24个符号。

7.9 完整解析示例

T 00 00 00 02 00 00 02 00 01 75 95 00 75 96 00 75 A0 FF 00 00
R 00 00 00 17
R 00 00 00 18

对应汇编代码:

.org 0x0000
00 00                 ; 填充字节
02 00 00             ; LJMP 目标地址(占位符)
02 00 01             ; LJMP 目标地址(占位符)
75 95 00             ; mov _P2M1,#0x00
75 96 00             ; mov _P2M0,#0x00
75 A0 FF             ; mov _P2,#0xFF
00 00                ; 填充字节

重定位信息:

R行 偏移 引用符号
R 00 00 00 17 3 符号17(可能是__sdcc_gsinit_startup)
R 00 00 00 18 6 符号18(可能是__sdcc_program_startup)

8. P行 - 分页信息行 (Paging Line)

8.1 格式定义

P 0 0 nn nn n1 n2 xx xx

8.2 字段说明

字段 含义 说明
P P行标识符 P
0 0 固定值 固定为两个0
nn nn 段索引 段索引
n1 重定位模式 与R行相同的重定位模式编码
n2 T行索引 指向T行中需要重定位的位置
xx xx 符号/段索引 引用的符号或段索引

8.3 对应的T行格式

T xx xx aa aa bb bb
字段 含义
xx xx 页区域内偏移
aa aa 页区域引用编号
bb bb 页基址(可能需要重定位)

8.4 说明

  • P行提供分页信息给链接器
  • 由 .setdp 伪指令指定
  • 与R行使用相同的重定位编码
  • 链接器会验证页基址是否在256字节边界上

8.5 默认分页区域

链接器默认将直接页引用指向输入REL文件中定义的第一个段。所有ASxxxx汇编器都会首先指定_CODE段,使其成为默认页区域。


9. O行 - 选项行 (Options Line)

9.1 格式定义

O options

9.2 字段说明

字段 含义
O O行标识符
options 汇编器选项字符串

9.3 说明

  • 记录汇编时的命令行选项
  • 用于调试和重复编译

9.4 实际示例

O -mmcs51 --model-small

含义:这个目标文件使用mcs51架构和小内存模式编译。


10. 综合示例解析

10.1 hello51.rel 完整结构

XH3
H 1A areas 0B global symbols
M hello51
O -mmcs51 --model-small
S __mcs51_genRAMCLEAR Ref000000
S _P2M0 Def000096
S .__.ABS. Def000000
S _P2M1 Def000095
S _P2 Def0000A0
S __sdcc_gsinit_startup Ref000000
S __start__stack Def000000
S __sdcc_program_startup Def000003
S _main Def000000
A _CODE size 0 flags 0 addr 0
A RSEG size 0 flags 8 addr 0
A REG_BANK_0 size 8 flags 4 addr 0
A SSEG size 1 flags 0 addr 0
A HOME size 6 flags 20 addr 0
A CSEG size 17 flags 20 addr 0
A GSFINAL size 3 flags 20 addr 0
T 00 00 00 02 00 01 02 00 03 75 95 00 75 96 00 75 A0 FF 00 00
R 00 00 00 07
R 00 00 00 08
R 00 00 00 0D

10.2 详细解析

文件头

  • 格式: XH3 - 扩展格式,十六进制,高位字节在前,版本3
  • 头部: 26个段,11个全局符号
  • 模块: hello51
  • 选项: -mmcs51 --model-small

符号表(9个符号)

  1. __mcs51_genRAMCLEAR - 引用(外部函数)
  2. _P2M0 - 定义(地址0x96)
  3. .__.ABS. - 定义(绝对段)
  4. _P2M1 - 定义(地址0x95)
  5. _P2 - 定义(地址0xA0)
  6. __sdcc_gsinit_startup - 引用(启动函数)
  7. __start__stack - 定义(栈起始)
  8. __sdcc_program_startup - 定义(入口点0x03)
  9. _main - 定义(入口点0x00)

段定义(7个段)

  1. _CODE - 代码段,0字节,可重定位
  2. RSEG - SFR段,0字节,绝对地址
  3. REG_BANK_0 - 寄存器组,8字节,可覆盖
  4. SSEG - 栈段,1字节,可重定位
  5. HOME - 向量区,6字节,初始化
  6. CSEG - 主代码,23字节,初始化
  7. GSFINAL - 初始化结束,3字节,初始化

代码数据

T 00 00 00 02 00 01 02 00 03 75 95 00 75 96 00 75 A0 FF 00 00

反汇编:

  • 02 00 01 - LJMP 0x0001(重定位:符号7)
  • 02 00 03 - LJMP 0x0003(重定位:符号8)
  • 75 95 00 - MOV 0x95,#0x00
  • 75 96 00 - MOV 0x96,#0x00
  • 75 A0 FF - MOV 0xA0,#0xFF
  • 00 00 - NOP

重定位信息

R行 T行偏移 引用符号 说明
R 00 00 00 07 3 符号7 (__start__stack) 第一个LJMP目标
R 00 00 00 08 6 符号8 (__sdcc_program_startup) 第二个LJMP目标
R 00 00 00 0D - 符号13 未知引用

11. 链接器处理过程

11.1 链接器任务

  1. 合并段: 将多个REL文件的同名段合并
  2. 分配地址: 为每个段分配绝对地址
  3. 解析符号: 将符号引用与定义匹配
  4. 处理重定位: 根据R行信息修正地址
  5. 生成输出: 生成最终的HEX或BIN文件

11.2 重定位过程示例

链接前(REL文件):

T 00 00 02 00 01       ; LJMP 0x0001(占位符)
R 00 00 00 07          ; 重定位到符号7

符号表:

符号7: __start__stack = 0x0080(在链接后的地址)

链接后(HEX文件):

地址 0x0000: 02 00 80       ; LJMP 0x0080(实际地址)

12. 附录

12.1 行类型速查表

行标识 名称 格式 用途
XH3 格式标识 XH3 文件格式版本
H 头部行 H aa areas gg symbols 段数和符号数
M 模块行 M name 模块名称
O 选项行 O options 汇编选项
S 符号行 S name Defnnnn 或 S name Refnnnn 符号定义或引用
A 段行 A name size ss flags ff 段定义
T 数据行 T offset data... 机器码数据
R 重定位行 R mode idx n2 sym... 重定位信息
P 分页行 P mode idx n2 sym... 分页信息

12.2 标志位速查

flags 二进制 ABS/REL OVR/CON PAG 说明
00 00000000 REL CON - 可重定位段
04 00000100 REL OVR - 可覆盖段
08 00001000 ABS CON - 绝对地址段
0C 00001100 ABS OVR - 绝对覆盖段
10 00010000 REL CON PAG 分页段
20 00100000 ABS CON - 初始化段
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 12:46 , Processed in 0.086594 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表