第七章配套练习源码

用途：配合《计算机系统-第七章ARM程序设计完整讲义.html》完成第3、4、5、6、8、9、10题。
主讲语法：ArmASM；Cortex-M4 Thumb；基本整数接口，所有混合对象采用兼容的ABI配置。
这是学习程序，不是已配置好具体开发板的IDE工程。没有声称已经在实板或MDK完成构建。

项目对应
q03：startup.s + q03/app.s，R3与Result=15（初值R2=5、原R3=8）
q04：startup.s + q04/app.s，R0与Result=5
q05：startup.s + q05/app.s，R0与Result=7
q06：startup.s + q06/app.s，R0与Result=5050
q08：startup.s + q08/app.s，R0与Result=120（N=5）
q09：startup.s + q09/app.s + q09/factorial.c，R0与Result=120
q10：startup.s + q10/main.c + q10/strlen.s，Result=10
每个q目录是一道单独练习，不要把所有同名exercise_main和Result同时加入一个工程。

建立MDK/Arm Compiler5教学工程
1. 选择STM32F407ZG或核对兼容目标；使用支持ArmASM语法的工具配置。
2. 不添加厂商另一个startup；添加本包startup.s和某一题列出的全部源文件。
3. 使用layout.sct：RESET在Flash 0x08000000最前，RW/ZI在RAM 0x20000000。
4. 保证所有汇编源、C源与库的CPU、Thumb、端序和ABI一致；本例不需浮点与标准库。
5. 构建并打开调试器，在startup.s的Halt或q10的C死循环观察寄存器/Result。
6. 实际板卡须核对芯片型号、Flash/RAM容量、启动模式、下载算法和连接。

最小启动约定
仅16个系统向量；不启用外部中断；Reset_Handler屏蔽可配置中断后调用exercise_main。
STACK预留1024字节并8对齐。没有调用__main或做通用.data/.bss初始化。
只读输入在Flash；汇编Result为NOINIT且先写后读；C例子也不读未初始化全局值，不调用库。
标准C工程请使用厂商完整启动与运行库，把应用接到main，而不是把两个startup混在一起。

Arm Compiler6的armclang/GNU汇编语法与本包ArmASM不同。不要把这些文件直接交给GNU方言
集成汇编器；需选择仍支持的ArmASM工具设置或按其文档迁移，并相应改链接布局。

可选的Arm Compiler5命令示意（在单独构建目录执行；按实际工具路径配置）
armasm --cpu Cortex-M4 --apcs=interwork -o startup.o ../startup.s
armasm --cpu Cortex-M4 --apcs=interwork -o app.o ../q09/app.s
armcc --cpu Cortex-M4 --thumb --c99 -c ../q09/factorial.c -o factorial.o
armlink --scatter ../layout.sct --entry Reset_Handler startup.o app.o factorial.o --output q09.axf
上述相对路径按“构建目录位于包根目录下一层”示意，实际以目录与工具版本为准。

验证范围
讲义整理时对核心Thumb指令流和算法做了汇编/模拟与边界核对；源码中ArmASM段/向量、
链接脚本和MDK配置未在此环境中进行实际MDK构建，也未连接实板。
完整教学解释、接口前提与勘误请读配套HTML。
