第1部分 汇编语言工具 3
第1章 汇编语言工具概述 3
1.1软件开发工具概述 3
1.2软件开发工具介绍 4
第2章 通用目标文件格式介绍 5
2.1 COFF文件类型 5
2.2段 5
2.3汇编器对段的处理 6
2.3.1未初始化段 6
2.3.2已初始化段 7
2.3.3已命名段 8
2.3.4子段 8
2.3.5段程序计数器 9
2.3.6使用段伪指令的实例 9
2.4连接器如何处理段 11
2.4.1默认的存储器分配 11
2.4.2将段放在存储器映像中 12
2.5重新定位 12
2.6运行时重新定位 14
2.7加载一个程序 14
2.8 COFF文件中的符号 15
2.8.1外部符号 15
2.8.2符号表 15
第3章 汇编器 16
3.1汇编器概述 16
3.2调用汇编器 16
3.3 C54x汇编器的特点 20
3.3.1字节/字寻址 20
3.3.2并行指令规则 22
3.3.3变长指令长度的确定 22
3.3.4存储器模式 23
3.3.5使用MMR地址时的汇编器警告 24
3.4为汇编器的输入命名备用的文件和路径 25
3.4.1使用-i汇编器选项 25
3.4.2使用环境变量(C54X_A_DIR和A_DIR) 26
3.5源程序语句的格式 27
3.5.1源程序语句的语法 27
3.5.2标号字段 27
3.5.3助记符指令字段 28
3.5.4代数指令字段 29
3.5.5注释字段 29
3.6常数 30
3.6.1二进制整数 30
3.6.2八进制整数 30
3.6.3十进制整数 31
3.6.4十六进制整数 31
3.6.5字符常数 31
3.6.6汇编时常数 31
3.6.7浮点常数 32
3.7字符串 32
3.8符号 33
3.8.1标号 33
3.8.2符号常数 33
3.8.3用-d选项定义符号常数 33
3.8.4预定义的符号常数 34
3.8.5替代符号 34
3.8.6局部标号 35
3.9表达式 37
3.9.1运算符 37
3.9.2表达式的上溢和下溢 38
3.9.3完整定义的表达式 38
3.9.4条件表达式 39
3.9.5可重新定位符号和合法的表达式 39
3.10内置函数 40
3.11源列表 41
3.12交叉引用列表 44
第4章 汇编伪指令 46
4.1伪指令概述 46
4.2与TMS320C1x/C2 x/ C2xx/C5x汇编器伪指令的兼容性 50
4.3用于段定义的伪指令 51
4.4用于初始化常量的伪指令 53
4.5调整段计数器的伪指令 55
4.6用于规范输出列表的伪指令 57
4.7用于调用其他文件的伪指令 58
4.8条件汇编伪指令 58
4.9汇编时符号伪指令 59
4.10其他伪指令 60
4.11伪指令参考信息 62
第5章 宏语言 107
5.1宏的使用 107
5.2定义宏 108
5.3宏参数/替代符号 109
5.3.1定义替代符号的伪指令 110
5.3.2内置的替代符号函数 111
5.3.3递归替代符号 112
5.3.4强制替代 112
5.3.5访问带下标的替代符号中的独立字符 113
5.3.6替代符号作为宏内的局部变量 114
5.4宏库 114
5.5在宏中使用条件汇编 115
5.6在宏中使用标号 116
5.7在宏中产生信息 118
5.8输出列表的格式化 119
5.9使用递归和嵌套的宏 120
5.10宏伪指令总结 121
第6章 连接器描述 123
6.1连接器概述 123
6.2如何调用连接器 123
6.3连接器选项 125
6.3.1重新定位能力(-a和-r选项) 126
6.3.2禁止符号调试信息的合并(-b选项) 127
6.3.3 C语言选项(-c和-cr选项) 127
6.3.4定义程序入口(-e global_symbol选项) 127
6.3.5设置默认的填充值(-fcc选项) 128
6.3.6将符号指定为全局符号(-g global_symbol选项) 128
6.3.7指定所有全局符号为静态(-h选项) 128
6.3.8定义堆的大小(-heap constant选项) 128
6.3.9改变库搜索算法(-l选项、-i选项和C54X_ C_DIR/C_ DIR环境变量) 129
6.3.10禁止条件连接(-j选项) 130
6.3.11忽略定位标志(-k选项) 130
6.3.12产生映像文件(-m filename选项) 130
6.3.13命名一个输出模块(-ofilename选项) 131
6.3.14指定静态运行(-q选项) 131
6.3.15删除符号信息(-s选项) 131
6.3.16定义堆栈大小(-stack constant选项) 131
6.3.17定义二级堆栈大小(-sysstack constant选项) 132
6.3.18引入一个未确定的符号(-u symbol选项) 132
6.3.19指定一个COFF格式(-v选项) 132
6.3.20显示输出段的信息(-w选项) 132
6.3.21穷举读库(-x和-priority选项) 133
6.4字节寻址/字寻址 134
6.5连接器命令文件 134
6.5.1连接器命令文件中的保留名 135
6.5.2命令文件中的常量 136
6.6目标库 136
6.7 MEMORY伪指令 137
6.7.1默认的存储器模型 137
6.7.2 MEMORY伪指令的语法 137
6.8 SECTIONS伪指令 139
6.8.1 SECTIONS伪指令的语法格式 140
6.8.2地址分配 141
6.8.3把存档库的一个成员分配到输出段 145
6.8.4使用多个存储器区域进行地址分配 146
6.8.5输出段在非连续存储器区域间的自动分割 146
6.9指定一个段的加载地址和运行地址 148
6.9.1指定加载地址和运行地址 148
6.9.2未初始化段 149
6.9.3使用.label伪指令引用加载地址 149
6.10使用UNION(联合段)和GROUP(成组段)语句 151
6.10.1用UNION语句使段重叠 151
6.10.2将输出段组合成组 152
6.10.3嵌套的联合段(UNION)和成组段(GROUP) 153
6.10.4检查地址分配的一致性 153
6.11重叠页 154
6.11.1使用MEMORY伪指令定义重叠页 155
6.11.2用SECTIONS伪指令定义重叠页 156
6.11.3页定义的语法格式 157
6.12默认的地址分配算法 157
6.12.1地址分配算法 158
6.12.2输出段的通常规则 158
6.13特殊的段类型(DSECT、COPY和NOLOAD) 159
6.14连接时给符号赋值 160
6.14.1赋值语句的语法 160
6.14.2将段程序计数器SPC值赋给一个符号 160
6.14.3赋值表达式 161
6.14.4连接器定义的符号 162
6.14.5只有C语言支持的符号定义(-c或-cr选项) 162
6.15产生和填充存储器空位 162
6.15.1已初始化段和未初始化段 163
6.15.2创建空位 163
6.15.3填充空位 164
6.15.4对未初始化段的显式初始化 165
6.16部分连接 166
6.17连接C/C++代码 167
6.17.1运行时的初始化 167
6.17.2目标库以及运行时的支持 167
6.17.3设置堆栈和堆的大小 168
6.17.4自动初始化(ROM和RAM模式) 168
6.17.5连接器选项-c和-cr 169
6.18连接器举例 169
第7章 文档管理器 173
7.1文档管理器概述 173
7.2调用文档管理器 173
7.3文档管理器举例 174
第8章 绝对地址列表器描述 176
8.1产生绝对地址列表 176
8.2调用绝对地址列表器 177
8.3绝对地址列表器用例 178
第9章 交叉引用列表器描述 182
9.1交叉引用列表的产生 182
9.2调用交叉引用列表器 183
9.3交叉引用列表举例 183
第10章 十六进制转换工具 185
10.1调用十六进制转换工具 185
10.2命令文件 187
10.2.1命令文件例子 187
10.3存储器宽度 188
10.3.1目标宽度 189
10.3.2数据宽度 189
10.3.3存储器宽度 189
10.3.4 ROM宽度 190
10.3.5一个存储器配置实例 191
10.3.6指定输出字的顺序 191
10.4 ROMS伪指令 192
10.4.1何时使用ROMS伪指令 193
10.4.2 ROMS伪指令的一个例子 194
10.4.3创建ROMS伪指令 195
10.5 SECTIONS伪指令 196
10.6输出文件名 197
10.6.1指定输出文件名 197
10.7映像模式和-fill选项 198
10.7.1 -image选项 198
10.7.2指定填充值 199
10.7.3映像模式的运行步骤 199
10.8为片内引导加载器创建一个引导表 199
10.8.1引导表说明 199
10.8.2引导表的格式 200
10.8.3怎样创建引导表 200
10.8.4从器件的外设引导 201
10.8.5设置引导表的入口 201
10.8.6使用C54x引导加载器 202
10.9控制ROM器件的地址 203
10.9.1控制起始地址 203
10.9.2控制地址递增索引 204
10.9.3 -byte选项 204
10.9.4处理地址空位 204
10.10目标格式的描述 205
10.10.1 ASCII-Hex目标格式(-a选项) 206
10.10.2 Intel MCS-86目标格式(-i选项) 206
10.10.3 Motorola-S目标格式(-m1、-m2、-m3选项) 207
10.10.4 TI-Tagged目标格式(-t选项) 208
10.10.5扩展的Tektronix目标格式(-x选项) 208
10.11十六进制转换工具的错误提示信息 209
第11章 助记符到代数语言的转换器描述 210
11.1转换器概述 210
11.1.1转换器做什么 210
11.1.2转换器不能做什么 210
11.2调用转换器 211
11.3转换器模式 211
11.3.1文字模式(-t选项) 211
11.3.2关于文字模式中的符号名 211
11.3.3扩展模式(-e选项) 212
11.4转换器对宏的处理 213
11.4.1宏中的伪指令 213
11.4.2宏的局部变量 214
11.4.3调用宏时定义的标号 214
第2部分C编译器 219
第12章C/C++编译器概述 219
12.1 C/C++编译器简介 219
12.1.1 ISO标准 219
12.1.2输出文件 219
12.1.3编译器接口 220
12.1.4编译器的操作 220
12.1.5辅助工具 220
12.2编译器与代码生成工具包(CCS) 220
第13章C/C++编译器的使用 222
13.1关于编译器 222
13.2 C/C++编译器的调用方法 223
13.3用选项控制编译器的操作 223
13.3.1常用选项 228
13.3.2指定文件名 230
13.3.3改变编译器对文件名的类型识别规则(-fa、-fc、-fg、-fo和-fp选项) 231
13.3.4改变编译器对文件名和扩展名的命名规则(-e选项) 231
13.3.5指定目录 232
13.3.6控制汇编器的选项 232
13.4使用环境变量 233
13.4.1指定路径(C_ DIR和C54X_ C_ DIR) 234
13.4.2设置默认的编译器选项(C_OPTION和C54X_C_OPTION) 234
13.5控制预处理器 235
13.5.1预定义的宏名 235
13.5.2 # include文件的搜索路径 235
13.5.3产生预处理列表文件(-PPo选项) 236
13.5.4预处理之后的继续编译(-ppa选项) 236
13.5.5产生带有注释的预处理列表文件(-ppc选项) 237
13.5.6产生带有行控制信息的预处理列表文件(-PPl选项) 237
13.5.7为代码生成工具产生预处理输出(-ppd选项) 237
13.5.8创建包含#include伪指令的文件列表(-ppi选项) 237
13.6理解诊断信息 237
13.6.1控制诊断信息 239
13.6.2怎样使用诊断屏蔽选项 240
13.6.3其他信息 240
13.7产生交叉引用列表信息(-px选项) 241
13.8创建一个原始的列表文件(-pl选项) 241
13.9使用内联函数展开 242
13.9.1 Intrinsic操作的内联 243
13.9.2非保护的定义控制内联 243
13.9.3保护的内联以及_INLINE预处理符号 244
13.9.4有关内联的限制 245
13.10使用交互列表 245
第14章 优化代码 247
14.1优化器的使用 247
14.2执行文件级优化(用-O3选项) 248
14.2.1控制文件级优化(-Ol选项) 248
14.2.2生成一个优化信息文件(-on选项) 249
14.3执行程序级优化(-pm和-O3选项) 249
14.3.1控制程序级的优化(-op选项) 249
14.3.2 C与汇编语言混合编程时的优化考虑 250
14.4关于在优化代码中使用asm语句的警告 251
14.5在已经优化的代码中访问别名变量 251
14.6自动内联展开(-oi选项) 252
14.7优化时使用交互列表工具 252
14.8调试优化后的代码 254
14.8.1调试优化后的代码(-g、-gw和-o选项) 254
14.8.2剖析已优化代码(-gp和-o选项) 254
14.9哪种优化正在执行 254
14.9.1基于开销的寄存器分配 255
14.9.2消除别名的歧义性 255
14.9.3跳转的优化和控制流的简化 255
14.9.4数据流的优化 256
14.9.5表达式的简化 257
14.9.6函数的内联展开 257
14.9.7索引变量和效用简化 258
14.9.8循环中固定代码的移出 259
14.9.9循环转换 259
14.9.10向后合并 259
14.9.11自增型寻址 260
14.9.12循环执行程序块 261
14.9.13延时的跳转、调用和返回 261
14.9.14代数重排、符号简化、常数合并 262
第15章C54x的C语言 263
15.1 TMS320C54x的C语言特点 263
15.1.1标识符和常数 263
15.1.2数据类型 263
15.1.3类型转换 264
15.1.4表达式 264
15.1.5声明 264
15.1.6预处理器 264
15.2 TMS320C54x的C++语言特点 265
15.3数据类型 265
15.4关键字 266
15.4.1 const关键字 266
15.4.2 ioport关键字 266
15.4.3 interrupt关键字 267
15.4.4 near和far关键字 268
15.4.5 volatile关键字 268
15.5寄存器变量 268
15.6全局寄存器变量 269
15.7 asm语句 270
15.8 Pragma伪指令 270
15.8.1 CODE_SECTION Pragma 271
15.8.2 DATA_SECTION Pragma 272
15.8.3 FUNC_CANNOT_INLINE Pragma 273
15.8.4 FUNC_EXT_CALLED Pragma 273
15.8.5 FUNC_IS_PURE Pragma 273
15.8.6 FUNC_IS_SYSTEM Pragma 274
15.8.7 FUNC_NEVER_RETURNS Pragma 274
15.8.8 FUNC_NO_GLOBAL_ASG Pragma 274
15.8.9 FUNC_NO_IND_ASG Pragma 275
15.8.10 IDENT Pragma 275
15.8.11 INTERRUPT Pragma 275
15.8.12 NO_INTERRUPT Pragma 276
15.9创建连接名 276
15.10初始化静态变量和全局变量 276
15.10.1用类型限定词const来初始化静态变量和全局变量 277
15.11改变ISO C语言模式(-pk、-pr和-ps选项) 277
15.11.1与K&R C的兼容(-pk选项) 278
15.11.2使能严格IS(O模式和非严格ISO模式(-ps和-pr选项) 279
15.11.3使能嵌入式C+++模式(-pe选项) 279
15.12编译器的限制 280
第16章 运行时环境 281
16.1存储器模式 281
16.1.1段 281
16.1.2 C/C++系统堆栈 282
16.1.3在程序存储器中给.const分配空间 283
16.1.4动态存储器分配 284
16.1.5变量的初始化 284
16.1.6给静态变量和全局变量分配存储器 284
16.1.7位域/结构体的定位 285
16.2字符串常量 285
16.3寄存器使用规则 286
16.3.1状态寄存器 286
16.3.2寄存器变量 287
16.4函数结构和调用规则 287
16.4.1函数如何产生调用 288
16.4.2被调用函数如何响应 288
16.4.3参数和局部变量的访问 289
16.4.4分配帧和使用32位存储器读指令 289
16.5 C/C++与汇编语言的接口 290
16.5.1在C/C++代码中使用汇编语言模块 290
16.5.2在C/C++程序中访问汇编语言变量 292
16.5.3使用内嵌的汇编语言 293
16.5.4使用内在函数(intrinsics)访问汇编语言语句 294
16.6中断管理 298
16.6.1关于中断的几个要点 298
16.6.2使用C/C++中断服务程序 299
16.6.3在中断入口处保存运行状态 299
16.7整数表达式分析 299
16.7.1运算的上溢和下溢 299
16.7.2带RTS调用的求值运算 300
16.7.3用C代码访问16位乘法的高16位 300
16.8浮点表达式分析 300
16.9系统初始化 301
16.9.1变量的自动初始化 301
16.9.2全局结构 302
16.9.3初始化表 302
16.9.4运行时的变量自动初始化 303
16.9.5加载时变量的自动初始化 303
第17章 运行时支持函数 305
17.1库 305
17.1.1 rts.src中的非标准头文件 305
17.1.2修改库函数 306
17.1.3用不同选项建库 306
17.2 C语言的I/O函数 306
17.2.1低级I/O操作概述 307
17.2.2为C语言I/O添加设备 308
17.3头文件 313
17.3.1诊断信息(assert.h/cassert) 314
17.3.2字符分类(character-typing)和转换(ctype.h/cctype) 314
17.3.3出错报告(errno.h/cerrno) 315
17.3.4扩展寻址函数(extaddr.h) 315
17.3.5低级I/O函数(file.h) 315
17.3.6取值范围的限制(float.h/cfloat和limits.h/climits) 315
17.3.7浮点数学(math.h/cmath) 317
17.3.8非局部跳转(setjmp.h/csetjmp) 317
17.3.9可变参数(stdarg.h/cstdarg) 317
17.3.10标准定义(stddef.h/cstddef) 318
17.3.11输入/输出函数(stdio.h/cstdio) 318
17.3.12通用工具(stdlib.h/cstdlib) 319
17.3.13字符串函数(string.h/cstring) 319
17.3.14时间函数(time.h/ctime) 319
17.3.15异常处理(exception和stdexcept) 320
17.3.16动态存储器管理(new) 320
17.3.17运行时类型信息(typeinfo) 320
17.4运行时支持函数和宏总结 321
17.5运行时支持函数和宏的描述 327
第18章 建库工具 365
18.1调用建库工具 365
18.2建库工具选项 365
18.3选项汇总 366
第19章C++的名称复原 368
19.1调用C++的名称复原工具 368
19.2 C++名称复原工具选项 368
19.3 C++名称复原工具的用例 369
第3部分 汇编语言指令集 373
第20章 汇编语言指令集概述 373
20.1指令集符号和缩略语 373
20.2指令说明的例子 376
第21章 指令集概述 379
21.1算术操作 379
21.2逻辑操作 383
21.3程序控制操作 385
21.4加载和存储操作 387
21.5循环执行一条指令 390
第22章 汇编语言指令 392