第一部分 C语言基础 1
第一章 词法 1
1.1 标识符 1
1.2 关键字 2
1.3 常量 2
1.3.1 整数常量 2
1.3.2 浮点数常量 3
1.3.3 枚举常量 4
1.3.4 字符常量 4
1.4 字符串 5
1.5 运算符 5
1.5.1 单目运算符 7
1.5.2 双目运算符 8
1.5.3 三目运算符 9
1.5.4 赋值运算符 10
1.5.5 逗号运算符 10
1.5.6 函数参数运算符 11
1.5.7 数组下标运算符 11
1.5.8 结构/联合成员运算符 11
1.5.9 结构/联合指针运算符 11
1.6 分隔符 11
1.6.1 方括号分隔符 12
1.6.2 圆括号分隔符 12
1.6.3 花括号分隔符 12
1.6.4 逗号分隔符 13
1.6.5 分号分隔符 13
1.6.6 冒号分隔符 13
1.6.7 省略号分隔符 13
1.6.8 星号分隔符 14
1.6.9 等号分隔符 14
1.6.10 预处理器伪指令符 14
1.7 空白符(nul) 14
第二章 说明 15
2.1 对象与左值 15
2.1.1 对象 15
2.1.2 左值 16
2.2 变量说明 16
2.3 数组说明 18
2.3.1 一维数组,一维指针数组,一维数组指针 19
2.3.2 多维数组,多维指针数组,多维数组指针,多重指针 20
2.4 结构说明 20
2.4.1 原型法 21
2.4.2 类型别名法 21
2.4.3 关于结构的讨论 22
2.4.4 位段结构 23
2.5 联合说明 23
2.6 函数说明 24
第三章 语句 27
3.1 语句 27
3.2 表达式 27
3.3 表达式语句 27
3.4 复合语句 28
3.5 循环语句 29
3.5.1 for循环语句 29
3.5.2 while循环语句 30
3.5.3 do while循环语句 31
3.6 条件语句 32
3.6.1 一般条件语句 32
3.6.2 嵌套条件语句 33
3.6.3 多选一条件语句 34
3.7 开关语句 36
3.8 间断语句 38
3.9 接续语句 39
3.10 跳转语句 39
3.11 返回语句 40
3.12 空语句 42
第四章 函数及函数库 44
4.1 前言 44
4.2 单文件程序(一)——字符串处理 44
4.3 单文件程序(二)——二维数组 46
4.4 多文件程序——台式计算器逆波兰算法的实现 47
4.5 关于函数参数值的传送问题 51
4.6 主函数 52
4.7 C语言的函数库 54
4.8 头文件 54
4.9 分类库函数 56
4.9.1 归类函数 56
4.9.2 转换函数 56
4.9.3 目录控制函数 57
4.9.4 诊断函数 57
4.9.5 图形函数 57
4.9.6 内部函数 58
4.9.7 输入输出函数 58
4.9.8 各类接口函数(dos,bios,8086) 60
4.9.9 串与内存块操作函数 61
4.9.10 数学函数 62
4.9.11 动态内存管理函数 63
4.9.12 杂项函数 63
4.9.13 进程控制函数 63
4.9.14 窗口文本显示函数 64
4.9.15 日期时间函数 64
4.9.16 变参数表函数 64
4.10 全局变量 65
4.10.1 argc 65
4.10.2 argv 65
4.10.3 ctype 65
4.10.4 daylight 65
4.10.5 directvideo 65
4.10.6 environ 66
4.10.7 error,_doserrno,sys_errlist,sys_nerr 66
4.10.8 fmode 67
4.10.9 heaplen 67
4.10.10 _new_handler 68
4.10.11 _osmajor,_osminor 68
4.10.12 _ovrbuffer 68
4.10.13 _psp 68
4.10.14 _stklen 68
4.10.15 timezone 69
4.10.16 tzname 69
4.10.17 _version 69
4.10.18 _wscroll 69
4.10.19 _8087 69
第五章 预处理器 71
5.1 前言 71
5.2 包含文件伪指令 71
5.3 伪指令宏 72
5.3.1 简单宏 72
5.3.2 参数宏 72
5.3.3 宏释放 73
5.3.4 条件宏定义 73
5.3.5 预定义宏 74
5.3.6 宏体中使用转义符#和合并符## 74
5.4 条件编译伪指令 75
5.5 #pragma伪指令 75
5.6 #line伪指令 75
5.7 #error伪指令 76
第二部分 C51(8051用8位嵌入式C语言) 78
第六章 C51前言 78
第七章 C51说明 79
7.1 C51简单变量说明 79
7.1.1 类型说明符bit 80
7.1.2 预定义特殊功能寄存器说明符sfr和sfr16 80
7.1.3 预定义特殊功能寄存器位说明符sbit 81
7.1.4 在bdata RAM空间定义位变量(借用位类型符sbit) 81
7.2 C51复合变量说明 82
7.3 C51指针变量说明 82
7.3.1 通用指针 83
7.3.2 抽象指针——匿名指针 84
7.3.3 指针可用运算符 85
第八章 C51存储模式 86
8.1 C51三种存储模式 86
8.2 C51内部对数据和函数的组织规范 87
8.2.1 标识符改大写字符和函数换名 87
8.2.2 全局变量存放的段名规定 87
8.2.3 函数的段名 87
8.2.4 函数的参数传送规则 88
8.2.5 重入栈的有关规定 89
8.2.6 函数返回值的规定 89
第九章 C51函数及库函数 90
9.1 函数说明 90
9.2 函数被修饰使用指定的寄存器组 91
9.3 函数被修饰为中断函数 92
9.4 函数被修饰为重入函数 93
9.5 函数被修饰为使用指定的存储模式 94
9.6 C51与PL/M51函数的交叉调用 95
9.7 C与汇编函数的交叉调用 95
9.8 内部函数 100
9.8.1 左移多位函数 100
9.8.2 右移多位函数 101
9.8.3 空操作函数 101
9.8.4 位测试函数 102
9.9 抽象数组(绝对地址存取)——absacc库函数 102
9.10 C51库函数介绍 103
第十章 C51 SFR头文件和配置文件 107
10.1 特殊功能寄存器头文件 107
10.2 C51配置文件 107
10.2.1 STARTUP.A51文件 108
10.2.2 INIT.A51文件 108
10.2.3 PUTCHAR.C文件 109
10.2.4 GETKEY.C文件 109
第十一章 C51预处理器伪指令 110
第十二章 C51编译命令行控制选项和控制伪指令 111
12.1 简介 111
12.2 编译命令行 111
12.2.1 一次性使用编译控制伪指令 112
12.2.2 可多次使用编译控制伪指令 118
第十三章 C51及L51使用方法 122
13.1 C51的使用环境 122
13.2 C51安装 122
13.3 编译方法 123
13.4 C51支持的文件名和设备名 123
13.5 错误号 123
13.6 连接/定位方法 124
13.7 连接控制选项 125
13.7.1 一般的连接控制选项 125
13.7.2 特殊的连接控制选项 126
13.8 定位控制选项 127
13.9 映像列表文件控制选项 129
13.10 连接/定位命令 129
13.11 特殊连接控制选项示例 131
13.12 使用C51和L51的完整示例 134
13.12.1 多模块编程 135
13.12.2 多模块编译 135
13.12.3 多模块连接定位 137
第三部分 XAC(80C51XA用16位嵌入式C语言) 143
第十四章 XAC说明 143
14.1 XAC变量说明 143
14.1.1 XAC一般变量说明 143
14.1.2 绝对变量与SFR 147
14.1.3 位变量与可位寻址SFR 147
14.2 XAC数组说明 148
14.3 XAC结构说明 148
14.4 XAC联合说明 148
14.5 XAC函数说明 148
14.5.1 XAC一般函数说明 149
14.5.2 XAC banked中断函数说明 149
14.5.3 中断向量表(ROM向量表)的添写 150
14.5.4 中断接管与RAM向量表 152
第十五章 XAC编译器内部管理规范和约定 154
15.1 XAC标准程序子段(psect) 154
15.2 XAC有关寄存器的约定 155
15.3 XAC有关参数传送和函数返回的约定 155
15.4 XAC关于函数的签字 156
15.5 XAC有关存储器的约定 156
15.6 XAC的存储模式 156
15.7 XAC关于运行时启动模块的规定 158
15.8 XAC上电子程序 158
15.9 XAC标准启动模块的编程 158
15.9.1 连接器定义符号名 158
15.9.2 bss和rbss清零程序 159
15.9.3 data和rdta复制程序 159
15.10 XAC定制的启动模块 159
15.10.1 手工优化代码 159
15.10.2 定制启动模块的编写 160
15.10.3 关于版权信息 160
第十六章 XAC的混合编程和函数库 161
16.1 C语言与汇编语言混合编程 161
16.1.1 C与汇编函数的交叉调用 161
16.1.2 在线嵌入汇编指令段 162
16.2 XAC运行时间库函数 162
16.2.1 标准输入输出库函数及用户的定制 162
16.2.2 XAC库函数汇总 163
16.2.3 XAC库管理器实用程序 166
第十七章 XAC编译器 168
17.1 编译命令行控制选项 168
17.1.1 -A(指定ROM和RAM定位地址) 169
17.1.2 -AAHEX(指定按美国自动化符号格式生成HEX文件) 169
17.1.3 -AV(指定符号文件用Avocet风格) 170
17.1.4 -BIN(指定生成二进制输出文件) 170
17.1.5 -Bl(指定选用大存储模式) 170
17.1.6 -Bm(指定选用中存储模式) 170
17.1.7 -Bs(指定选用小存储模式) 170
17.1.8 -C(只翻译到目标文件) 171
17.1.9 -CR(生成交叉访问表) 171
17.1.10 -CLIST(生成C列表文件) 171
17.1.11 -D(定义宏) 171
17.1.12 -DOUBLE(起用IEEE64位DOUBLE变量) 172
17.1.13 -E(编译器使用editor格式的错误信息) 172
17.1.14 -E(编译器错误信息重定向到指定文件) 172
17.1.15 -H(生成汇编级符号文件) 172
17.1.16 -I(指定附加的搜索头文件的路径) 173
17.1.17 -L(指定附加的扫描库) 173
17.1.18 -L-(指定传递给LINKER的控制选项) 173
17.1.19 -M(生成映像文件) 173
17.1.20 -MOTOROLA(生成Motorola S-Record格式的HEX文件) 174
17.1.21 -N(指定标识符有效字符长度) 174
17.1.22 -O(启动优化) 174
17.1.23 -O(指定输出文件) 174
17.1.24 -OMF51(指定生成OMF51格式的输出文件) 174
17.1.25 -PROTO(指定生成包括ANSI和K R风格的函数原型文件) 174
17.1.26 -PSECTMAP(程序段映像表) 174
17.1.27 -S(编译生成汇编源文件) 175
17.1.28 -STRICT(严格遵守ANSI标准) 175
17.1.29 -TEK(编译生成Tektronics HEX文件) 175
17.1.30 -U(解除宏定义) 176
17.1.31 -UBROF(指定生成UBROF格式的输出文件) 176
17.1.32 -UNSIGNED(指定unsigned char为char的缺省类型) 176
17.1.33 -V(详示编译命令) 176
17.1.34 -W(设置告警级别) 176
17.1.35 -X(去除局部符号) 176
17.1.36 -Zg(启动全局优化) 176
17.2 编译器输出文件格式 176
17.3 编译器生成的符号文件 177
17.4 CREF生成交叉访问表的实用程序 177
17.4.1 -F路径或文件名 177
17.4.2 -H表头名 178
17.4.3 -L每页行数 178
17.4.4 -O输出文件名 178
17.4.5 -P页宽 178
17.4.6 -S包含拒选符号的文件名 178
17.4.7 -X拒选符号的前导字符序列 178
第十八章 XAC预处理器 178
18.1 XAC预定义宏 179
18.2 #pragma编译控制伪指令 179
第十九章 XAC宏汇编器 179
19.1 序言 181
19.2 XA汇编源文件语句 181
19.2.1 字符集 181
19.2.2 数 181
19.2.3 分隔符 181
19.2.4 特殊字符 181
19.2.5 标识符 182
19.2.6 汇编生成的标识符 182
19.2.7 位置计数器 182
19.2.8 寄存器符号 182
19.2.9 字符串 182
19.2.10 暂时标号 182
19.2.11 表达式 182
19.2.12 汇编语句的格式 183
19.3 XA汇编伪指令 183
19.3.1 伪指令语句格式 183
19.3.2 PUBLIC 183
19.3.3 EXTRN 184
19.3.4 GLOBAL 184
19.3.5 END 184
19.3.6 程序段(PSECT) 184
19.3.7 ORG 185
19.3.8 EQU和SET 185
19.3.9 DB和DW 186
19.3.10 DF 186
19.3.11 DS 186
19.3.12 IF ELSE EKSEIF ENDIF 186
19.3.13 SIGNAT 186
19.3.14 控制选项伪指令行 187
19.4 宏 187
19.4.1 MACRO ENDM 187
19.4.2 LOCAL 188
19.4.3 REPT 188
19.4.4 IRP 189
19.4.5 IRPC 190
19.5 XA汇编命令行 190
19.5.1 XA汇编命令行格式 190
19.5.2 汇编选项 190
第二十章 HLINK连接器 191
20.1 简介 192
20.2 连接与定位(或装载)的基本概念 192
20.3 连接命令 192
20.4 OBJTOHEX实用程序 193
第二十一章 HPDXA 51XA集成开发平台 194
21.1 安装 196
21.1.1 MS_DOS下的安装 196
21.1.2 UNIX操作系统下的安装 196
21.2 快速入门 196
21.2.1 简单程序示例 197
21.2.2 使用HPDXA 197
21.2.3 使用XAC命令行 197
21.2.4 运行程序 197
21.3 HPDXA用户接口 198
21.3.1 监视器模式必性选择 198
21.3.2 菜单命令操作 198
21.4 HPDXA菜单命令快览 199
21.4.1 系统子菜单(<<>>) 202
21.4.2 File子菜单 202
21.4.3 Edit子菜单 202
21.4.4 Option子菜单 202
21.4.5 Compile子菜单 203
21.4.6 Make子菜单 203
21.4.7 Run子菜单 204
21.4.8 Utility子菜单 205
21.4.9 Help子菜单 206
21.5 HPDXA编辑器 207
21.6 编译连接一条龙示例 207
附录 209
附录A C51函数库 209
A.1 数学函数 209
A.1.1 函数名:abs,cabs.fabs.labs 209
A.1.2 函数名:exp,log,log10 210
A.1.3 函数名:sqrt 210
A.1.4 函数名:rand,srand 211
A.1.5 函数名:cos,sin,tan 211
A.1.6 函数名:acos,asin,atan,atan2 212
A.1.7 函数名:cosh,sinh,tanh, 212
A.1.8 函数名:fpsave,fprestore 213
A.1.9 函数名:ceil 214
A.1.10 函数名:floor 214
A.1.11 函数名:modf 214
A.1.12 函数名:pow 215
A.2 标准化I/O函数 215
A.2.1 函数名:_getkey() 216
A.2.2 函数名:getchar 216
A.2.3 函数名:gets 216
A.2.4 函数名:ungetchar 217
A.2.5 函数名:-ungetkey 217
A.2.6 函数名:putchar 218
A.2.7 函数名:printf 218
A.2.8 函数名:sprintf 220
A.2.9 函数名:puts 221
A.2.10 函数名:scanf 221
A.2.11 函数名:sscanf 223
A.3 动态存储函数 223
A.3.1 函数名:calloc 224
A.3.2 函数名:free 224
A.3.3 函数名:int_mempool 225
A.3.4 函数名:malloc 225
A.3.5 函数名:realloc 226
A.4 字符归类函数 226
A.4.1 函数名:isalpha 226
A.4.2 函数名:isalnum 227
A.4.3 函数名:iscntrl 227
A.4.4 函数名:isdigit 228
A.4.5 函数名:isgraph 228
A.4.6 函数名:isprint 229
A.4.7 函数名:ispunct 229
A.4.8 函数名:islower 230
A.4.9 函数名:isupper 230
A.4.10 函数名:isspace 231
A.4.11 函数名:isxdigit 231
A.4.12 函数名:toascii(参数宏) 232
A.4.13 函数名:toint 232
A.4.14 函数名:tolower 232
A.4.15 函数名:tolower(参数宏) 233
A.4.16 函数名:toupper 233
A.4.17 函数名:_toupper(参数宏) 234
A.5 字符串函数 234
A.5.1 函数名:memchr 234
A.5.2 函数名:memcmp 235
A.5.3 函数名:memcpy 236
A.5.4 函数名:memccpy 236
A.5.5 函数名:memmove 237
A.5.6 函数名:memset 237
A.5.7 函数名:strcat 238
A.5.8 函数名:strncat 238
A.5.9 函数名:strcmp 239
A.5.10 函数名:strncmp 239
A.5.11 函数名:strcpy 240
A.5.12 函数名:strncpy 240
A.5.13 函数名:strlen 241
A.5.14 函数名:strchr,strpos 241
A.5.15 函数名:strrchr,strrpos 242
A.5.16 函数名:strspn,strcspn,strpbrk,strrpbrk 243
A.6 字符串转换函数 244
A.6.1 函数名:atof 244
A.6.2 函数名:atol 245
A.6.3 函数名:atoi 245
A.7 变参数函数 246
A.7.1 宏名:va_list 246
A.7.2 宏名:va_start(va_list ap,last_argument) 246
A.7.3 宏名:type va_arg(va_list ap,type) 246
A.7.4 宏名:va_end(va_list ap) 246
A.8 全程跳转函数 248
A.8.1 函数名:setjmp 248
A.8.2 函数名:longjmp 248
A.9 内部函数 250
A.9.1 函数名:_crol_,_irol_,_lrol_ 250
A.9.2 函数名:_cror_,_iror_,_lror_ 250
A.9.3 函数名:_nop_ 251
A.9.4 函数名:_testbit_ 251
A.10 抽象数组 252
A.10.1 函数名:CBYTE,BDYTE,PBYTE,XBYTE 252
A.10.2 函数名:CWORD,DWORD,XWORD,PWORD 252
附录B C51编译器使用错误提示 253
B.1 前言 253
B.2 致命错误 253
B.3 语法及语义错误 255
附录C L51连接/定位器使用错误提示 267
C.1 前言 267
C.2 L51警告 267
C.3 L51错误 269
C.4 L51致命错误 272
C.5 例外信息 275
附录D C51的极限值 276
附录E XAC运行时间库函数 277
E.1 ACOS 277
E.2 ASCTIME 277
E.3 ASIN 278
E.4 ASSERT 279
E.5 ATAN 280
E.6 ATOF 280
E.7 ATOI 281
E.8 ATOL 281
E.9 BSEARCH 282
E.10 CALLOC 283
E.11 CEIL 284
E.12 CGETS 284
E.13 COS 285
E.14 COSH,SINH,TANH 286
E.15 CPUTS 286
E.16 CTIME 287
E.17 DI,EI 287
E.18 DIV 288
E.19 EXIT 289
E.20 EXP 289
E.21 FABS 290
E.22 FLOOR 290
E.23 FREE 291
E.24 FREXP 292
E.25 GETC 292
E.26 GETCH,GETCHE,UNGETCH 293
E.27 GETS 293
E.28 GMTIME 294
E.29 ISALNUM,ISALPHA,ISDIGIT,ISLOWER等 295
E.30 KBHIT 296
E.31 LDEXP 296
E.32 LDIV 297
E.33 LOCALTIME 298
E.34 LOG,LOG10 299
E.35 LONGJMP 299
E.36 MALLOC 300
E.37 MEMCHR 301
E.38 MEMCMP 302
E.39 MEMCPY 303
E.40 MEMMOV 303
E.41 MEMSET 304
E.42 PERSIST_CHECK,ERSIST_VALIDATE 304
E.43 POW 305
E.44 PRINTF,VPRINTF 306
E.45 PUTCH 308
E.46 PUTS 308
E.47 QSORT 309
E.48 RAND 310
E.49 REALLOC 310
E.50 SCANF,VSCANF 311
E.51 SET_VECTOR 312
E.52 SETJMP 313
E.53 SIN 314
E.54 SPRINTF,VSPRINTF 315
E.55 SQRT 315
E.56 SRAND 316
E.57 SSCANF,VSSCANF 317
E.58 STRCAT 318
E.59 STRCHR 318
E.60 STRCMP 319
E.61 STRCPY 320
E.62 STRLEN 320
E.63 STRNCAT 321
E.64 STRNCMP 322
E.65 STRNCPY 322
E.66 STRRCHR 323
E.67 TAN 324
E.68 TOLOWER,TOUPPER,TOASCII 324
E.69 VA_STSRT,VA_ARG,VA_END 325
附录F XAC使用错误信息 327
附录G HTDXA菜单命令热键 363