Cx51 编译器
对传统和扩展的 8051 微处理器的
优化的 C 编译器和库参考
翻译者
网名:jxlxh
E-mail: jx_lxh@163.com
本翻译作品可免费下载传阅,但未经允许不得用于商业用途。
原文件:
C51.pdf
www.c51bbs.com
网站协助发布
用户手册 09.2001
Keil Software – Cx51 编译器用户手册
—
ፉᑗኔ
ፉᑗኔ
由于本人的英语水平有限 所以在使用 KEIL C51 的过程中 老要去看那英文的手册
总感到不是那么方便 老要用词霸查来查去的 烦的很 因此在看到 C51BBS 上的倡议
后
就动了把它翻译出来的念头 我想这对自己和别人都会带来些好处
利用工作之余的时间 经过几个月的努力 终于把它翻译完了 但由于水平所限 文
中肯定有很多不是十分恰当的地方
起误解
使我能够作出改正 对于大家的建议我会很高兴的接受
我最大的愿望是希望我的翻译不会误导大家 且能对大家有所帮助
不明之处可以参考英文原文
所以在这里 我请大家能指出其中的错误和不当之处 请大家 EMAIL 告诉我
或许没有用大家比较熟悉的惯用语 或许可能引
感谢 C51BBS 版主龙啸九天的帮助
欢迎大家与我交流 我的 e-mail
jx_lxh@163.com
Keil Software – Cx51 编译器用户手册--内容
Keil Software 声明
本文档所述信息不属于我公司的承诺范围 其内容的变化也不会另行通知 本文档所
述软件的出售必须经过授权或签订特别协议
在协议约定以外的任何媒体上复制本软件将触犯法律 购买者可以备份为目的而做一份拷
贝
在未经书面许可之前 本手册的任何一部分都不允许为了购买者个人使用以外的目的
而以任何形式和任何手段(电子的
机械的)进行复制或传播
本文档所述软件的使用必须遵循协议约定
2
版权 1988-2001 所有者
Keil C51™ Keil CX51™,和 uVision TM
Microsoft®和 Windows™是 Microsoft Corporation 的商标或注册商标
IBM® PC®
Intel® MCS®51 MCS®251 ASM-51®
和 PS/2®是 International Business Machines Corporation 的注册商标
Keil Elektronik GmbH 和 Keil Software 公司
是 Keil Elektronik GmbH 的商标
和 PL/M-51® 是 Intel 的注册商标
我们尽全力去做来保证这本手册的正确 从而保证我们个人 公司和在此提及的商标
的形象
Keil Software – Cx51 编译器用户手册--内容
前言
3
本手册讲述对 8051 的目标环境 如何使用
译器包可以用在所有的 8051 系列处理器上
册假定你熟悉 WINDOWS 操作系统
知道如何编程 8051 处理器 并会用 C 语言编程
可以在 WINDOWS 32 位命令行中执行 本手
优化 C 编译器编译 C 程序
Cx 51
Cx 51
编
注意
本手册用条件窗口来指明32位
ME
WINDOWS NT WINDOWS 2000或WINDWOS XP
如果你对 C 编程有问题 或者你想知道 C 语言编程的更多信息 可参考 16 页的 关于 C
语言的书
手册中讨论的许多例子和描述是从 WINDOWS 命令提示符下调用的 这对在一个集成环境
如µVision2 中运行 Cx 51 的情况是不适用的
编程环境
WINDOWS
版本是
WINDOWS95 WINDOWS98 WINDOWS
本手册中的例子是通用的 可以应用到所有
Keil Software – Cx51 编译器用户手册--内容
手册组织
本用户手册分成下面的章节和附录
第一章 介绍 概述 Cx 51 编译器
第二章 用 Cx 51 编译 解释怎样用 Cx 51 交叉编译器编译一个源文件 本章叙
述控制文件处理
第三章 语言扩展 叙述支持 8051 系统结构必须的 C 语言扩展 本章提供一
个在 ANSI C 说明中没有的命令
第四章 预处理器 叙述 Cx 51 编译器预处理器的组成和包含的例子
第五章 派生的 8051 叙述 Cx 51 编译器支持的 8051 派生系列 本章还包括能
帮助提高目标程序性能的技巧
第六章 高级编程技术 对有经验的开发人员的重要信息 本章包括定制文件
描述
8051 编程语言如何接口
优化器详细资料 和段名约定 本章还讨论了 Cx 51 编译器产生的程序和别的
编译和输出的命令行提示
函数 和控制的详细列表
4
第七章 错误信息 列出了在使用 Cx 51 编译器时可能遇到的致命错误 语法
错误和警告
第八章 库参考 提高一个扩展的 Cx 51 库参考 分类列出了库例程和相关的
包含文件
附录中包含不同编译器版本间的差异 作品编号 和别的有些信息
本章最后有一个按字母顺序的参考 包括每个库例程的例子代码
Keil Software – Cx51 编译器用户手册--内容
文档约定
本文档有下列约定
例子 说明
README.TXT
Language Elements
Courier
Variables
重复的成分… 例子中使用的省略号
省略代码
.
.
.
可选项
[
opt1|opt2
{
Keys
]
}
粗体大写用在可执行程序名 数据文件名 源文件名 环境变量
和输入WINDOWS 命令行的命令上 表示你必须手工输入的文本
不一定要大写
例
CLS DIR BL51 .EXE
C 语言的构成包括关键词
例
if != long
isdigit main >>
这种字体的文本代表显示在屏幕上或打印出的信息 这字体也用在
讨论或描述命令行中
斜体字必须提供的信息 例如 在语法字符串中的 projectfile 表示需
要提供实际的工程文件名
垂直省略号用在源代码例子中 表示省略一段程序
例子
void main(void ) {
.
.
.
while(1);
命令行中的可选参数和选择项用方括号表示
例
C51 TEST.C PRINT [( filename)]
大括号中的文本 用竖线分隔 代表一组选项 必须从中选一项
大括号中包含了所有选项
竖线分隔选项
Sans serif 字体的文本代表键盘的键
操作符和库函数用粗体
表示重复的成分
…
例如 按 Enter 继续
5
Keil Software – Cx51 编译器用户手册--内容
6
Keil Software – Cx51 编译器用户手册--内容
Contents
Chapter 1. Introduction....................................................................................15
Support for all 8051 Variants......................................................................................15
Books About the C Language ..................................................................................... 16
Chapter 2. Compiling with the Cx 51 Compiler .............................................17
Environment Variables ............................................................................................... 17
Running Cx 51 from the Command Prompt................................................................. 18
ERRORLEVEL..................................................................................................... 19
Cx 51 Output Files ................................................................................................. 19
Control Directives....................................................................................................... 20
Directive Categories.............................................................................................. 20
Reference.................................................................................................................... 23
AREGS / NOAREGS............................................................................................ 24
ASM / ENDASM.................................................................................................. 26
BROWSE.............................................................................................................. 28
CODE.................................................................................................................... 29
COMPACT ........................................................................................................... 30
COND / NOCOND ............................................................................................... 31
DEBUG................................................................................................................. 33
DEFINE ................................................................................................................ 34
DISABLE.............................................................................................................. 35
EJECT................................................................................................................... 37
FLOATFUZZY..................................................................................................... 38
INCDIR................................................................................................................. 39
INTERVAL........................................................................................................... 40
INTPROMOTE / NOINTPROMOTE .................................................................. 41
INTVECTOR / NOINTVECTOR ........................................................................ 44
LARGE ................................................................................................................. 46
LISTINCLUDE..................................................................................................... 47
MAXARGS........................................................................................................... 48
MOD517 / NOMOD517 ....................................................................................... 49
MODA2 / NOMODA2 .........................................................................................51
MODAB2 / NOMODAB2 .................................................................................... 52
MODDA2 / NOMODDA2.................................................................................... 53
MODDP2 / NOMODDP2..................................................................................... 54
MODP2 / NOMODP2........................................................................................... 55
NOAMAKE .......................................................................................................... 56
NOEXTEND......................................................................................................... 57
OBJECT / NOOBJECT ........................................................................................ 58
OBJECTADVANCE ............................................................................................ 59
OBJECTEXTEND................................................................................................ 60
ONEREGBANK ................................................................................................... 61
OMF2.................................................................................................................... 62
OPTIMIZE............................................................................................................ 63
7
Keil Software – Cx51 编译器用户手册--内容
ORDER .................................................................................................................65
PAGELENGTH ....................................................................................................66
PAGEWIDTH ....................................................................................................... 67
PREPRINT............................................................................................................68
PRINT / NOPRINT...............................................................................................69
REGFILE ..............................................................................................................70
REGISTERBANK ................................................................................................71
REGPARMS / NOREGPARMS ........................................................................... 72
RET_PSTK, RET_XSTK ....................................................................................74
ROM......................................................................................................................76
SAVE / RESTORE................................................................................................77
SMALL .................................................................................................................78
SRC .......................................................................................................................79
STRING ................................................................................................................80
SYMBOLS............................................................................................................81
USERCLASS ........................................................................................................82
VARBANKING.................................................................................................... 84
WARNINGLEVEL...............................................................................................85
XCROM ................................................................................................................86
8
Chapter 3. Language Extensions .....................................................................89
Keywords .................................................................................................................... 89
Memory Areas.............................................................................................................90
Program Memory .................................................................................................. 90
Internal Data Memory ...........................................................................................91
External Data Memory................................................................................................ 92
Far Memory........................................................................................................... 93
Special Function Register Memory .......................................................................93
Memory Models.......................................................................................................... 94
Small Model .......................................................................................................... 94
Compact Model.....................................................................................................95
Large Model.......................................................................................................... 95
Memory Types............................................................................................................ 95
Explicitly Declared Memory Types.......................................................................96
Implicit Memory Types......................................................................................... 97
Data Types ..................................................................................................................97
Bit Types..................................................................................................................... 98
Bit-addressable Objects...............................................................................................99
Special Function Registers........................................................................................ 101
sfr ........................................................................................................................101
sfr16 ....................................................................................................................102
sbit.......................................................................................................................102
Absolute Variable Location ...................................................................................... 104
Pointers .....................................................................................................................106
Generic Pointers .................................................................................................. 106
Memory-specific Pointers....................................................................................109
Pointer Conversions ............................................................................................ 111
Abstract Pointers .................................................................................................114
Keil Software – Cx51 编译器用户手册--内容
Function Declarations............................................................................................... 118
Function Parameters and the Stack ..................................................................... 119
Passing Parameters in Registers.......................................................................... 120
Function Return Values....................................................................................... 120
Specifying the Memory Model for a Function .................................................... 121
Specifying the Register Bank for a Function....................................................... 122
Register Bank Access.......................................................................................... 124
Interrupt Functions.............................................................................................. 125
Reentrant Functions ............................................................................................ 129
Alien Function (PL/M-51 Interface) ...................................................................132
Real-time Function Tasks.................................................................................... 133
Chapter 4. Preprocessor ................................................................................. 135
Directives.................................................................................................................. 135
Stringize Operator..................................................................................................... 136
Token-pasting operator............................................................................................. 137
Predefined Macro Constants..................................................................................... 138
Chapter 5. 8051 Derivatives ...........................................................................139
Analog Devices MicroConverter B2 Series.............................................................. 140
Atmel 89x8252 and Variants .................................................................................... 141
Dallas 80C320, 420, 520, and 530............................................................................ 142
Dallas 80C390, 80C400, 5240, and Variants............................................................143
Arithmetic Accelerator........................................................................................ 144
Infineon C517, C509, 80C537, and Variants............................................................ 145
Data Pointers....................................................................................................... 145
High-speed Arithmetic ........................................................................................ 146
Library Routines..................................................................................................146
Philips 8xC750, 8xC751, and 8xC752...................................................................... 147
Philips 80C51MX Architecture ................................................................................ 148
Philips and Atmel WM Dual DPTR .........................................................................148
9
Chapter 6. Advanced Programming Techniques.........................................149
Customization Files .................................................................................................. 150
STARTUP.A51................................................................................................... 151
INIT.A51............................................................................................................. 153
XBANKING.A51 ...............................................................................................154
Basic I/O Functions............................................................................................. 156
Memory Allocation Functions............................................................................. 156
Optimizer.................................................................................................................. 157
General Optimizations ........................................................................................157
8051-Specific Optimizations............................................................................... 158
Options for Code Generation .............................................................................. 158
Segment Naming Conventions.................................................................................. 159
Data Objects........................................................................................................ 160
Program Objects.................................................................................................. 161
Interfacing C Programs to Assembler....................................................................... 163
Function Parameters............................................................................................ 163
Keil Software – Cx51 编译器用户手册--内容
Parameter Passing in Registers............................................................................ 164
Parameter Passing in Fixed Memory Locations ..................................................165
Function Return Values....................................................................................... 165
Using the SRC Directive ..................................................................................... 166
Register Usage.....................................................................................................168
Overlaying Segments...........................................................................................168
Example Routines................................................................................................168
Small Model Example.........................................................................................169
Compact Model Example.................................................................................... 171
Large Model Example.........................................................................................173
Interfacing C Programs to PL/M-51..........................................................................175
Data Storage Formats................................................................................................ 176
Bit Variables........................................................................................................176
Signed and Unsigned Characters, Pointers to data, idata, and pdata ..................177
Signed and Unsigned Integers, Enumerations, Pointers to xdata and
code .....................................................................................................................177
Signed and Unsigned Long Integers.................................................................... 177
Generic and Far Pointers ..................................................................................... 178
Floating-point Numbers.......................................................................................179
Floating-point Errors...........................................................................................182
Accessing Absolute Memory Locations....................................................................184
Absolute Memory Access Macros....................................................................... 184
Linker Location Controls ....................................................................................185
The _at_ Keyword...............................................................................................186
Debugging.................................................................................................................187
10
Chapter 7. Error Messages ............................................................................189
Fatal Errors ...............................................................................................................189
Actions ................................................................................................................ 190
Errors...................................................................................................................191
Syntax and Semantic Errors ......................................................................................193
Warnings...................................................................................................................205
Chapter 8. Library Reference........................................................................209
Intrinsic Routines...................................................................................................... 209
Library Files.............................................................................................................. 210
Standard Types..........................................................................................................211
jmp_buf ...............................................................................................................211
va_list .................................................................................................................. 211
Absolute Memory Access Macros.............................................................................212
CBYTE................................................................................................................212
CWORD..............................................................................................................212
DBYTE ...............................................................................................................213
DWORD..............................................................................................................213
FARRAY, FCARRAY .......................................................................................214
FVAR, FCVAR,..................................................................................................215
PBYTE ................................................................................................................ 216
PWORD ..............................................................................................................216
Keil Software – Cx51 编译器用户手册--内容
XBYTE ............................................................................................................... 217
XWORD .............................................................................................................217
Routines by Category................................................................................................ 218
Buffer Manipulation............................................................................................ 218
Character Conversion and Classification ............................................................ 219
Data Conversion.................................................................................................. 220
Math Routines..................................................................................................... 221
Memory Allocation Routines .............................................................................. 223
Stream Input and Output Routines ...................................................................... 224
String Manipulation Routines ............................................................................. 226
Variable-length Argument List Routines............................................................. 227
Miscellaneous Routines.......................................................................................227
Include Files.............................................................................................................. 228
8051 Special Function Register Include Files..................................................... 228
80C517.H............................................................................................................ 228
ABSACC.H......................................................................................................... 229
ASSERT.H.......................................................................................................... 229
CTYPE.H............................................................................................................ 229
INTRINS.H......................................................................................................... 229
MATH.H............................................................................................................. 230
SETJMP.H .......................................................................................................... 230
STDARG.H......................................................................................................... 230
STDDEF.H ......................................................................................................... 230
STDIO.H............................................................................................................. 231
STDLIB.H........................................................................................................... 231
STRING.H .......................................................................................................... 231
Reference.................................................................................................................. 232
abs ....................................................................................................................... 233
acos / acos517 ..................................................................................................... 234
asin / asin517....................................................................................................... 235
assert ................................................................................................................... 236
atan / atan517 ...................................................................................................... 237
atan2.................................................................................................................... 238
atof / atof517....................................................................................................... 239
atoi ...................................................................................................................... 240
atol ...................................................................................................................... 241
cabs ..................................................................................................................... 242
calloc................................................................................................................... 243
ceil....................................................................................................................... 244
_chkfloat_ ...........................................................................................................245
cos / cos517......................................................................................................... 246
cosh ..................................................................................................................... 247
_crol_ .................................................................................................................. 248
_cror_.................................................................................................................. 249
exp / exp517........................................................................................................ 250
fabs...................................................................................................................... 251
floor..................................................................................................................... 252
11
Keil Software – Cx51 编译器用户手册--内容
fmod .................................................................................................................... 253
free ......................................................................................................................254
getchar................................................................................................................. 255
_getkey ................................................................................................................ 256
gets ...................................................................................................................... 257
init_mempool.......................................................................................................258
_irol_ ...................................................................................................................259
_iror_...................................................................................................................260
isalnum ................................................................................................................ 261
isalpha .................................................................................................................262
iscntrl................................................................................................................... 263
isdigit................................................................................................................... 264
isgraph.................................................................................................................265
islower.................................................................................................................266
isprint...................................................................................................................267
ispunct .................................................................................................................268
isspace .................................................................................................................269
isupper.................................................................................................................270
isxdigit................................................................................................................. 271
labs ...................................................................................................................... 272
log / log517 .........................................................................................................273
log10 / log10517 .................................................................................................274
longjmp ...............................................................................................................275
_lrol_ ...................................................................................................................277
_lror_...................................................................................................................278
malloc..................................................................................................................279
memccpy .............................................................................................................280
memchr................................................................................................................281
memcmp ..............................................................................................................282
memcpy...............................................................................................................283
memmove ............................................................................................................284
memset ................................................................................................................ 285
modf .................................................................................................................... 286
_nop_................................................................................................................... 287
offsetof ................................................................................................................ 288
pow...................................................................................................................... 289
printf / printf517..................................................................................................290
putchar................................................................................................................. 296
puts ...................................................................................................................... 297
rand......................................................................................................................298
realloc..................................................................................................................299
scanf .................................................................................................................... 300
setjmp .................................................................................................................. 304
sin / sin517 .......................................................................................................... 305
sinh ...................................................................................................................... 306
sprintf / sprintf517............................................................................................... 307
sqrt / sqrt517........................................................................................................309
12
Keil Software – Cx51 编译器用户手册--内容
srand.................................................................................................................... 310
sscanf / sscanf517................................................................................................ 311
strcat.................................................................................................................... 313
strchr ................................................................................................................... 314
strcmp.................................................................................................................. 315
strcpy................................................................................................................... 316
strcspn ................................................................................................................. 317
strlen.................................................................................................................... 318
strncat.................................................................................................................. 319
strncmp................................................................................................................ 320
strncpy................................................................................................................. 321
strpbrk ................................................................................................................. 322
strpos................................................................................................................... 323
strrchr.................................................................................................................. 324
strrpbrk................................................................................................................ 325
strrpos.................................................................................................................. 326
strspn................................................................................................................... 327
strstr .................................................................................................................... 328
strtod / strtod517 ............................................................................................... 329
strtol .................................................................................................................... 331
strtoul .................................................................................................................. 333
tan / tan517.......................................................................................................... 335
tanh...................................................................................................................... 336
_testbit_............................................................................................................... 337
toascii.................................................................................................................. 338
toint ..................................................................................................................... 339
tolower ................................................................................................................ 340
_tolower .............................................................................................................. 341
toupper ................................................................................................................ 342
_toupper .............................................................................................................. 343
ungetchar............................................................................................................. 344
va_arg.................................................................................................................. 345
va_end................................................................................................................. 347
va_start................................................................................................................ 348
vprintf.................................................................................................................. 349
vsprintf................................................................................................................ 351
13
Appendix A. Differences from ANSI C.........................................................353
Compiler-related Differences.................................................................................... 353
Library-related Differences....................................................................................... 353
Appendix B. Version Differences...................................................................357
Version 6.0 Differences............................................................................................ 357
Version 5 Differences............................................................................................... 358
Version 4 Differences............................................................................................... 359
Version 3.4 Differences............................................................................................ 361
Version 3.2 Differences............................................................................................ 362
Version 3.0 Differences............................................................................................ 363
Keil Software – Cx51 编译器用户手册--内容
Version 2 Differences ............................................................................................... 364
Appendix C. Writing Optimum Code ...........................................................367
Memory Model ......................................................................................................... 367
Variable Location......................................................................................................369
Variable Size.............................................................................................................369
Unsigned Types.........................................................................................................370
Local Variables .........................................................................................................370
Other Sources............................................................................................................ 370
Appendix D. Compiler Limits........................................................................371
Appendix E. Byte Ordering............................................................................373
Appendix F. Hints, Tips, and Techniques.....................................................375
Recursive Code Reference Error............................................................................... 375
Problems Using the printf Routines ..........................................................................376
Uncalled Functions....................................................................................................377
Using Monitor-51......................................................................................................377
Trouble with the bdata Memory Type....................................................................... 378
Function Pointers ...................................................................................................... 379
14
Glossary.............................................................................................................383
Index..................................................................................................................391
Keil Software – Cx51 编译器用户手册—第一章 介绍
ጙᐺ
15
C 语言是一个通用的编程语言
C 不是一种大语言
各种软件任务提供方便和有效的编程
优化的 Cx 51 C 编译器完整的实现了 ANSI 的 C 语言标准 对 8051 来说
个通用的 C 编译器
有 C 编程的弹性和高效的代码和汇编语言的速度
C 语言不能执行的操作
的一部分提供
既然 Cx 51 是一个交叉编译器
一个嵌套的目标处理器的特性
不是为任何特殊应用领域而设计 它一般来说限制较少 可以为
它首先的目标是生成针对 8051 的最快和最紧凑的代码
如输入和输出 需要操作系统的支持 这些操作作为标准库
因为这些函数和语言本身无关 所以 C 特别适合对多平台提供代码
它提供高效的代码 结构化的编程 和丰富的操作符
许多应用用 C 比其他语言编程更方便和有效
C 语言的某些方面和标准库就有了改变或增强
更多的细节参考 89 页的 第三章.语言扩展
Cx 51 不是一
Cx 51 具
以适应
支持所有的 8051 变种
8051 系列是增长最快的微处理器构架之一
新扩展的 8051 芯片 如 PHILIPS 8051MX 有几 M 字节的代码和数据空间 可被用到
大的应用中
为了支持这些不同的 8051 芯片
输出文件格式
的 PHILIPS 8051MX 结构
OMF2
允许支持最多 16MB 代码和数据空间
KEIL 提供了几种开发工具
从不同的芯片厂家提供了 400 多种芯片
如下表所列 一个新的
CX51 编译器适用于新
Keil Software – Cx51 编译器用户手册—第一章 介绍
开发工具 支持的微处理器 说明
C51编译器
A51宏汇编
BL51连接器
C51编译器 有OMF2输出
AX51宏汇编
LX51连接器
CX51编译器
AX51宏汇编
LX51连接器
16
对传统的8051开发工具 包括支持32 x64KB
的代码库
对传统的8051和扩展的8051芯片 如DALLAS
390 的开发工具 包括支持代码库 和最
多16MB代码和XDATA存储区
对PHILIPS 8051MX的开发工具 支持最多16MB
代码和XDATA存储区
编译器在不同的包中提供
Cx51
上表是完整的 8051 开发工具参考
注意
Cx51 指两种编译器 C51 编译器和 CX51 编译器
C 语言的书
有许多书介绍 C 语言 有更多的书详细介绍用 C 完成的任务 下面的列表不是一个完
整的列表
The C Programming Language, Second Edition
Kernighan & Ritchie
Prentice-Hall, Inc.
ISBN 0-13-110370-9
C: A Reference Manual, Second Edition
Harbison & Steel
Prentice-Hall Software Series
ISBN 0-13-109810-1
列表只是作为参考
C and the 8051: Programming and Multitasking
Schultz
P T R Prentice-Hall, Inc.
ISBN 0-13-753815-4
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
17
ᐺ
本章说明怎样编译C源文件 讨论编译器的控制命令 这些命令可以
命令
控制包含在
指定优化级别和存储模式
注意
一般来说你应在
户手册
C x 51 编译器产生列表文件
Getting Started with µVision2 and C51”.
Cx51
OBJ
文件中的信息的数量
µVision2 IDE
中使用
ܠፉܠፉ
Cx51
关于使用
µVision2 IDE
环境变量
的更多信息 参考用
如果在µVision2 IDE 中运行 Cx51 编译器 计算机不需要另外的设置 如果想要在命令
行中运行 Cx 51 编译器和工具
变量 路径 环境变量说明
PATH \C51\BIN
TMP
C51INC \C51\INC
C51LIB \C51\LIB
对 WINSOWS NT
System – Advanced – Environment Variables 中输入
对 WINDOWS 95
中
PATH=C \KEIL\C51\BIN;%PATH%
SET TMP=D:\
WINDOWS 2000和 WINDOWS XP
WINDOWS 98 和 WINDOWS ME
必须手工创建下面的环境变量
C51 和CX51 可执行程序的路径
编译器产生的临时文件的路径 如果指定的路径不存
在 编译器会生成错误并停止编译
Cx51头文件的路径
Cx51库文件的路径
这些环境变量在Control Panel –
这些设置放在 AUTOEXEC.BAT
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
SET C51INC=C:\KEIL\C51\INC
SET C51LIB=C:\KEIL\C51\LIB
从命令行运行 Cx51
调用 C51 或 CX51 编译器 在命令行输入 C51 或 CX51 在命令行中 必须包含要编
译的 C 源文件
C51 sourcefile [directives…]
CX51 sourcefile [directives…]
或
C51 @commandfile
CX51 @commandfile
这里
和必需的编译控制命令
Cx51 命令行的格式
18
sourcefile 要编译的源文件名
directives 用来控制编译器功能的命令
commandfile 包含源文件名和命令的命令输入文件
了WINDOWS 命令行的限制时
下面的命令行例子调用
PREPRINT
C51
使用commandfile
指定源文件 SAMPLE.C 用控制 DEBUG
参考20页的 控制命令
当Cx 51 调用行较复杂 超过
C51 SAMPLE.C DEBUG CODE PREPRINT
Cx 51 编译器在成功编译后显示下面的信息
C51 COMPILER V6.10
C51 COMPILATION COMPLETE. 0 WARNING S 0 ERROR S
CODE 和
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
错误级别
19
在编译后 错误和警告的数目输出在屏幕上
编译的状态
错误级别 意义
可以在批处理文件中访问 ERRORLEVEL 变量 关于 ERRORLEVEL 或批处理文件
可以参考
值如下表所列
0
1
2
3
WINDOWS
没有错误或警告
只有警告
错误和可能的警告
致命错误
命令索引或在线帮助
C x 51 编译器设置 ERRORLEVEL 指示
Cx51输出文件
C x 51 编译器在编译时产生许多输出文件
的扩展名不同
文件扩展 说明
Filename.LST
Filename.OBJ
Filename.I
Filename.SRC
下面的表列出了文件并有简短的说明
列表文件 包含格式化的源文件和编译中检测到的错误 列
表文件可以选择包含所用的符号和生成汇编代码 更多的信
息 参考PRINT 命令
包含可重定位目标代码的OBJ 模块
连接到一个绝对的OBJ 模块
包含由预处理器扩展的源文件 所有的宏都 扩展了 所有的
注释都删除了 可参考PREPRINT 命令
C 源代码产生的汇编源文件
令
缺省的 输出文件和源文件同名 但 文件
OBJ 模块用Lx51 连接器
可以用A51 汇编 可参考SRC 命
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
控制命令
20
C x 51 编译器提供许多控制命令控制编译
组成
C51 testfile.c SYMBOLS CODE DEBUG
#pragma SYMBOLS CODE DEBUG
在说明的例子中
的源文件
在命令行中在文件名后指定 或在源文件中用#pragma 命令 例如
SYMBOLS CODE
除了指定的 命令由一个或多个字母或数字
和
DEBUG
都是控制命令
testfile.C
是要编译
注意
对命令行和
#pragma
语法是相同的 在
#pragma
可指定多个选项
典型的 每个控制命令只在源文件的开头指定一次 如果一个命令指定多次 编译器
产生一个致命错误
退出编译 可以指定多次的命令在下面部分注明
命令种类
控制命令可以分成三类 源文件控制 目标控制 和列表控制
源文件控制定义命令行的宏
目标控制影响产生的目标模块
化级别或在OBJ 文件中包含调试信息
列表控制管理列表文件
上
定义要编译的文件名
*.OBJ
*.LST
的各种样式 特别是格式和指定的内容
的形式和内容 这些命令指定优
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
下表按字母顺序列出了控制命令 有下划线的字母表示命令的缩写
命令 类 说明
AREGS
Object
使能或不使能绝对寄存器
NOAREGS
ASM ENDASM
BROWSE
†
CODE †
COMPACT
†
COND
NOCOND
†
DEBUG †
DEFINE
DISABLE
EJECT
FLOATFUZZY
Source
Object
Listing
Object
Listing
Object
Source
Object
Listing
Object
标志内嵌汇编块的开始和结束
产生浏览器信息
加一个汇编列表到列表文件
设置COMPACT存储模式
包含或执行预处理器跳过的源程序行
在OBJ 文件中包含调试信息
在Cx51 调用行定义预处理器名
在一个函数内不允许中断
在列表文件中插入一个格式输入字符
在浮点比较中指定位数
INCDIR † Source 指定头文件的附加路径名
INTERVAL
†
INTPROMOTE
Object
Object
对SIECO 芯片指定中断矢量间隔
使能或不使能ANSI 整数同时提升
NOINTPROMOTE
†
INTVECTOR
Object
指定中断矢量的基地址或不使能矢量
NOINTVECTOR †
LARGE †
LISTINCLUDE
MAXAREGS
†
MOD517
NOMOD517
MODA2
NOMODA2
MODAB2
NOMODAB2
MODDA
NOMODDA
MODDP2
NOMODDP2
MODP2
NOMODP2
NOAMAKE †
NOEXTEND
OBJECT
NOOBJECT
OBJECTEXTEND
†
ONEREGBANK
†
†
Object
Listing
Object
Object
Object
Object
Object
Object
Object
Object
Source
Object
Object
Object
选择LARGE 存储模式
在列表文件中显示头文件
指定可变参数列表的大小
使能或不使能代码支持80C517 和派生的额外的硬
件特征
使能或不使能ATMEL 82x8252和变种的双DPTR 寄
存器
使能或不使能模拟设备ADuC B2 系列支持双DPTR
寄存器
使能或不使能DALLAS 80C390
支持算法加速器
使能或不使能DALLAS 的320
变种支持双DPTR 寄存器
使能或不使能PHILIPS 和ATMELWM 派生的支持
双DPTR 寄存器
不记录µVision2 更新信息
Cx51 不扩展到ANSI C
指定一个OBJ 文件或禁止OBJ 文件
在OBJ 文件中包含变量类型信息
假定在中断中只用寄存器组0
ARn
地址
80C400
520 530 550和
21
和 5240
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
命令 类 说明
OMF2
†
OPTIMIZE
ORDER
†
PAGELENGTH
PAGEWIDTH
PREPRINT
†
†
PRINT
NOPRINT
REGFILE
†
†
REGISTERBANK
REGPARMS
Object
Object
Object
Listing
†
Listing
Listing
Listing
Object
Object
Object
产生OMF2 输出文件格式
指定编译器的优化级别
按源文件中变量的出现顺序分配
指定页的行数
指定页的列数
产生一个预处理器列表文件 扩展所有宏
指定一个列表文件名或不使能列表文件
对全局寄存器优化指定一个寄存器定义文件
为绝对寄存器访问选择寄存器组
使能或不使能寄存器参数传递
NOREGPARMS
RET_PSTK
RET_XSTK
ROM
†
†
†
SAVE
RESTORE
SMALL
†
SRC
†
STRING
SYMBOLS
USERCLASS
†
†
†
VARBANKING
WARNINGLEVEL
†
XCROM
†
Object
Object
Object
用重入堆栈保存返回地址
AJMP/ACALL 指令产生控制
保存和恢复AREGS
令设置
Object
Object
Object
Listing
Object
Object
†
Listing
Object
选择SMALL 存储模式 缺省
产生一个汇编源文件 不产生OBJ 模块
定位固定字符串到XDATA或远端存储区
模块中所有符号的列表文件
对可变的变量位置重命名存储区类
使能FAR 存储类型变量
选择警告检测级别
对CONST XDATA变量假定ROM 空间
22
REGPARMS和 OPTIMIZE命
这些命令在命令行或源文件开头的#pragma 中只指定一次 在一个源文件中不
†
能使用多次
控制命令和参数 除了用 DEFINE 命令的参数 是大小写无关的
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
参考
本章的余下部分按字母顺序描述 Cx 51 编译器控制命令 他们分成如下部分
缩写 可以替代命令的缩写
参数 命令可选和要求的参数
缺省 命令的缺省设置
23
µVision2 控制
说明 详细的说明命令和使用
参考 相关命令
例子 命令使用的例子 有时 也列出结果
怎样指定命令
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
AREGS/NOAREGS
缩写 无
24
参数
缺省
µVision2 控制
说明
无
AREGS
Options – C51 – Don‘t use absolute register access
AREGS控制使编译器对寄存器R0 到R7 用绝对寄存器地址
地址提高了代码的效率
绝对地址
可用REGISTERBANK 命令定义使用的寄存器组
NOAREGS命令对寄存器R0 到R7 不使能绝对 寄存器地址
NOAREGS编译的函数可以使用所有的8051 寄 存器组
在被别的函数用不同的寄存器组调用的函数中
用AREGS 命令可以直接PUSH 或POP 寄存器
例如
PUSH 和POP 指令只能用直接或
命令可用
注意
虽然可能在一个程序中定义了几次
AREGS/NOAREGS
选项只
有定义在函数声明为有效
绝对
用
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
例子 下面是一个使用NOAREGS 和AREGS 的源程序和代码的列表
stmt level source
1 extern char func ();
2 char k;
3
4 #pragma NOAREGS
5 noaregfunc () {
6 1 k = func () + func ();
71 }
8
9 #pragma AREGS
10 aregfunc () {
11 1 k = func () + func ();
12 1 }
25
; FUNCTION noaregfunc (BEGIN)
; SOURCE LINE # 6
0000 120000 E LCALL func
0003 EF MOV A,R7
0004 C0E0 PUSH ACC
0006 120000 E LCALL func
0009 D0E0 POP ACC
000B 2F ADD A,R7
000C F500 R MOV k,A
; SOURCE LINE # 7
000E 22 RET
; FUNCTION noaregfunc (END)
; FUNCTION aregfunc (BEGIN)
; SOURCE LINE # 11
0000 120000 E LCALL func
0003 C007 PUSH AR7
0005 120000 E LCALL func
0008 D0E0 POP ACC
000A 2F ADD A,R7
000B F500 R MOV k,A
; SOURCE LINE # 12
000D 22 RET
; FUNCTION aregfunc (END)
注意保存R7 到堆栈 中的不同方法 函数noaregfunc 产生的代码
是
MOV A R7
PUSH ACC
同时对 aregfunc 函数的代码是
PUSH AR7
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
ASM/ENDASM
缩写 无
26
参数
缺省
µVision2 控制
说明
无
无
本命令不能在命令行指定
ASM命令标志一块源程序的开始
令产生的.SRC 文件中
这些源程序可以认为是内嵌的汇编 然而 它只输出到由SRC 命
令产生的源文件中
在µVision2 应对C 源文件中包含ASM/ENDASM 段如下设置一个
文件指定选项
右键点击PROJECT窗口 – 文件表中的文件
选择Options for… 打开选项 – 属性页
源程序不汇编和输出到OBJ 文件中
它可以直接合并到由SRC 命
使能Generate Assembler SRC file
使能Assemble SRC file
用这些设置
编译产生一个OBJ 文件
ENDASM 命令标志一个源程序块的结束
µVision2 产生一个汇编源文件
.OBJ
注意
ASM和ENDASM
命令只能在源文件中使用 且作为
令的一部分
.SRC
并用汇编
#pragma
命
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
27
例子
#pragma asm / #pragma endasm
下面是 C源文件
.
.
.
stmt level source
1 extern void test ();
2
3 main () {
4 1 test ();
51
6 1 #pragma asm
7 1 JMP $ ; endless loop
8 1 #pragma endasm
91 }
.
.
产生下面的.SRC 文件
; ASM.SRC generated from: ASM.C
NAME ASM
?PR?main?ASM SEGMENT CODE
EXTRN CODE (test)
EXTRN CODE (?C_STARTUP)
PUBLIC main
; extern void test ();
;
; main () {
main:
; test ();
;
; #pragma asm
; #pragma endasm
;}
RSEG ?PR?main?ASM
USING 0
; SOURCE LINE # 3
; SOURCE LINE # 4
LCALL test
JMP $ ; endless loop
; SOURCE LINE # 9
RET ; END OF main
END
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
BROWSE
28
缩写
参数
缺省
µVision2 控制
说明
例子
BR
无
不创建浏览信息
Options – Output – Browse Information
用BROWSE 编译器产生浏览信息 浏览信 息包括标识符 包
含预处理器符号
信息可以在µVision2 内显示 选择View – Source Browser打开
µVision2 源浏览器
源浏览器
能
C51 SAMPLE.C BROWSE
#pragma browse
他们的存储空间 类型 定义和参考列表
参考µVision2
用户手册 第四章
µVision2
功
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
CODE
29
缩写
参数
缺省
µVision2 控制
说明
例子
CD
无
不产生汇编代码列表
Options – Listing – C Compiler Listing – Assembly Code
CODE 命令附加一个汇编助记符列表到列表文件
代表源程序中的每个函数
缺省的 在列表文件中没有汇编代码
汇编程序代码
C51 SAMPLE.C CD
#pragma code
下面例子显示C 源程序和它产生的OBJ 结果代码和助记符
编间显示了产生代码的行号
字符R 和E 代表可重定位和外部的
在汇
stmt level source
1 extern unsigned char a, b;
2 unsigned char c;
3
4 main()
5{
6 1 c = 14 + 15 * ((b / c) + 252);
71 }
.
.
.
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION main (BEGIN)
0000 E500 E MOV A,b
0002 8500F0 R MOV B,c
0005 84 DIV AB
0006 75F00F MOV B,#0FH
0009 A4 MUL AB
000A 24D2 ADD A,#0D2H
000C F500 R MOV c,A
000E 22 RET
; FUNCTION main (END)
; SOURCE LINE # 5
; SOURCE LINE # 6
; SOURCE LINE # 7
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
COMPACT
30
缩写
参数
缺省
µVision2 控制
说明
CP
无
SMALL
Options – Target – Memory Model
本命令选择COMPACT存储模式
在COMPACT存储模式中 所有的函数和程序变量和局部数据段
定位在8051 系统的外部数据存储区
字节
不管什么存储类型 可以在任何8051 的存储范围内声明变量 但
是
储区可以显著的提高系统性能
一页 在本模式中 外部数据存储区的短地址用@R0/R1
把常用的变量 如循环计数器和数组索引 放在内部数据存
外部数据存储区可有最多256
注意
函数调用所用的堆栈经常放在
IDATA
存储区
参考
例子
SAMLL LARGE ROM
C51 SAMPLE.C COMPACT
#pragma compact
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
COND/NOCOND
31
缩写
参数
缺省
µVision2 控制
说明
CO
无
COND
Options – Listing – C Compiler Listing - Conditional
本命令定义这些部分的受条件编译影响的源程序是否显示在列表
文件中
COND 命令在列表文件中包含编译省略的行
以便于阅读
出
本命令影响预处理器删除的行
NOCOND 命令不在列表文件中包含编译省略的行
行号和嵌套级不输
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
例子 下面的例子显示用COND 命令编译产生的一个列表文件
.
.
.
stmt level source
1 extern unsigned char a, b;
2 unsigned char c;
3
4 main()
5{
6 1 #if defined (VAX)
c = 13;
#elif defined (_ _TIME_ _)
9 1 b = 14;
10 1 a = 15;
11 1 #endif
12 1 }
.
.
32
下面的例子用 NOCOND 命令编译产生的一个列表文件
.
.
.
stmt level source
1 extern unsigned char a, b;
2 unsigned char c;
3
4 main()
5{
6 1 #if defined (VAX)
9 1 b = 14;
10 1 a = 15;
11 1 #endif
12 1 }
.
.
.
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
DEBUG
33
缩写
参数
缺省
µVision2 控制
说明
DB
无
不产生调试信息
Options – Output – Debug Information
DEBUG 命令指示编译器在
文件不包含调试信息
对程序的符号测试必需有调试信息 信息包括全局和局部变量定义
和地址
程中仍有效
模拟器使用
注意
OBJECTEXTEND
量类型定义信息
和函数名和行号 包含在目标模块中的调试信息在连接过
这些信息可以被
命令用来指示编译器在目标文件中包含附加的变
文件中包含调试信息
OBJ
µVision2
调试器或任何
缺省
INTEL
OBJ
兼容的
参考
例子
OBJECTEXTEND
C51 SAMPLE.C DEBUG
#pragma db
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
DEFINE
34
缩写
参数 一个或多个符合C语言约定的的名称 用逗号分隔 对每个名称
缺省 无
µVision2 控制
说明
例子
DF
可有一个参数
在
Options –Cx51 – Define
DEFINE命令定义调用行的名称
#ifndef查询这些名称
大小写相关的
注意
DEFINE
命令
C51 SAMPLE.C DEFINE check,NoExtRam
命令只能在命令行中指定 在一个C源程序中用C预处理器
#define
用DEFINE 给出
输入名称
预处理器要用#if
定义的名称在输入后被复制 这些命令是
作为一个选项 每个名称可跟一个值
#ifdef 和
C51 MYPROG.C DF (X1=“1+5”,iofunc=“getkey()”)
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
DISABLE
缩写 无
参数 无
35
缺省
µVision2 控制
说明
无
本命令不能在命令行中指定 只能在源文件中指定
DISABLE 命令指示编译器在产生代码时
所有中断
令指定
重新指定
注意
DISABLE
DISABLE
执行后不使能中断
一个不使能中断的函数不能对调用者返回一个位值
DISABLE必须在 一个函数声明前一行用 #pragma命
DISABLE控制只用到一个函数
只能用
可在一个源文件中指定多次 对每个函数只能指定一次
#pragma
命令指定 不能在命令行指定
在一个函数内不使能
对每个新的函数必须
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
36
例子
本例子是一个用DISABLE 命令函数的源程序和代码列表 注意EA 指
定函数寄存器在函数进入时清除
复
MOV EA C
.
.
.
stmt level source
1 typedef unsigned char uchar;
2
3 #pragma disable /* Disable Interrupts */
4 uchar dfunc (uchar p1, uchar p2) {
5 1 return (p1 * p2 + p2 * p1);
61 }
; FUNCTION _dfunc (BEGIN)
0000 D3 SETB C
0001 10AF01 JBC EA,?C0002
0004 C3 CLR C
0005 ?C0002:
0005 C0D0 PUSH PSW
;---- Variable 'p1' assigned to register 'R7' ---;---- Variable 'p2' assigned to register 'R5' ----
0007 ED MOV A,R5
0008 8FF0 MOV B,R7
000A A4 MUL AB
000B 25E0 ADD A,ACC
000D FF MOV R7,A
000E ?C0001:
000E D0D0 POP PSW
0010 92AF MOV EA,C
0012 22 RET
; FUNCTION _dfunc (END)
.
.
.
; SOURCE LINE # 4
; SOURCE LINE # 5
; SOURCE LINE # 6
JBC EA C002
在结尾时恢
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
EJECT
37
缩写
参数 无
缺省
µVision2 控制
说明
例子 #pragma eject
EJ
无
本命令不能在命令行中指定 只能在源文件中指定
EJECT 命令在列表文件中插入一个格式输入字符
注意
EJECT
只在源文件中出现 必须是
#pragma
命令的一部分
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
FLOATFUZZY
38
缩写
参数
缺省
µVision2 控制
说明
例子
FF
间的一个数字
0到7
FLOATFUZZY 3
Options - Cx51
– Bits to round for float compare
FLOATFUZZY 命令在一个浮点比较前定义位数
少有三个有效位
C51 MYFILE.C FLOATFUZZY 2
#pragma FF(0)
缺省值3指定最
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
INCDIR
缩写 无
参数 指定头文件的路径
缺省 无
39
µVision2 控制
说明
例子
Options - Cx51
INCDIR 命令指定Cx51 编译器头文件的位置
径声明
如果需要多个路径 路径名必须用分号分开 如果指定
“filename.h”
当找不到或用了
录
路径
C51 SAMPLE.C INDIR C \KEIL\C51\MYINC;C:\CHIP-DIR
当仍找不到 就使用C51INC 环境变量指定的路径
– Include Paths
Cx51编译器首先搜 索当前目录
#include <filename.h>
编译器最多50个路
然后是源文件目
就搜索INCDIR 指定的
#include
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
INTERVAL
缩写 无
参数 对中断矢量表可选 用括号括住
40
缺省
µVision2 控制
说明
参考
INTERVAL 8
Options - Cx51
INTERVAL 命令指 定中断矢量的间隔
生系列要求的
器定位中断矢量在绝对地址
(interval×n)+offset+3,
这里
interval INTERVAL命令的参数
n 中断号
offset INTVECTOR命令的参数
INTVECTOR/NOINTVECTOR
– Misc controls:enter the directive
它定义中断矢量在3字节间隔 用本命令 编译
如下计算
指定间隔是
缺省为
8
缺省为
0
SIECO-51
派
例子
C51 SAMPLE.C INTERVAL 3
#pragma interval(3)
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
INTPROMOTE/NOINTPROMOTE
41
缩写
参数 无
缺省
µVision2 控制
说明
例子
IP/NOIP
INTPROMOTE
Options - Cx51
INTPROMOTE 命令使能
在比较前所用的表达式从小类型提升到整数表达式 这使
MICROSOFT C和BORLAND C
因为8051 是8 位处理器 使用INTPROMOTE 命令可能在某些应用中
降低效率
NOINTPROMOTE 命令不使能自动整数提升
的
C51 SAMPLE.C INTPROMOTE
– Enable ANSI integer promotion rules
编译器间有更大的兼容性
ANSI
整数提升规则
ANSI
改动很少就可用到Cx51 上
然而 整数提升可能降低效率
如果提升声明了
整数提升使Cx51
和别
#pragma intpormote
C51 SAMPLE.C NOINTPROMOTE
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
下面的代码示范用INTPROMOTE 和NOINTPROMOTE 命令产生的
代码
stmt lvl source
1 char c;
2 unsigned char c1,c2;
3 int i;
4
5 main () {
6 1 if (c == 0xff)c=0; /*never true! */
7 1 if(c==-1)c=1; /*works */
8 1 i=c+5;
9 1 if (c1 < c2 +4) c1 = 0;
10 1 }
42
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
Code generated with INTPROMOTE Code generated with NOINTPROMOTE
; FUNCTION main (BEGIN)
0000 AF00 MOV R7,c
0002 EF MOV A,R7
0003 33 RLC A
0004 95E0 SUBB A,ACC
0006 FE MOV R6,A
0007 EF MOV A,R7
0008 F4 CPL A
0009 4E ORL A,R6
000A 7002 JNZ ?C0001
000C F500 MOV c,A
000E ?C0001:
000E E500 MOV A,c
0010 B4FF03 CJNE A,#0FFH,?C0002
0013 750001 MOV c,#01H
0016 ?C0002:
0016 AF00 MOV R7,c
0018 EF MOV A,R7
0019 33 RLC A
001A 95E0 SUBB A,ACC
001C FE MOV R6,A
001D EF MOV A,R7
001E 2405 ADD A,#05H
0020 F500 MOV i+01H,A
0022 E4 CLR A
0023 3E ADDC A,R6
0024 F500 MOV i,A
0026 E500 MOV A,c2
0028 2404 ADD A,#04H
002A FF MOV R7,A
002B E4 CLR A
002C 33 RLC A
002D FE MOV R6,A
002E C3 CLR C
002F E500 MOV A,c1
0031 9F SUBB A,R7
0032 EE MOV A,R6
0033 6480 XRL A,#080H
0035 F8 MOV R0,A
0036 7480 MOV A,#080H
0038 98 SUBB A,R0
0039 5003 JNC ?C0004
003B E4 CLR A
003C F500 MOV c1,A
003E ?C0004:
003E 22 RET
; SOURCE LINE # 6
; SOURCE LINE # 7
; SOURCE LINE # 8
; SOURCE LINE # 9
; SOURCE LINE # 10
; FUNCTION main (END)
0000 AF00 MOV R7,c
0002 EF MOV A,R7
0003 33 RLC A
0004 95E0 SUBB A,ACC
0006 FE MOV R6,A
0007 EF MOV A,R7
0008 F4 CPL A
0009 4E ORL A,R6
000A 7002 JNZ ?C0001
000C F500 MOV c,A
000E ?C0001:
000E E500 MOV A,c
0010 B4FF03 CJNE A,#0FFH,?C0002
0013 750001 MOV c,#01H
0016
0016 E500 MOV A,c
0018 2405 ADD A,#05H
001A FF MOV R7,A
001B 33 RLC A
001C 95E0 SUBB A,ACC
001E F500 MOV i,A
0020 8F00 MOV i+01H,R7
0022 E500 MOV A,c2
0024 2404 ADD A,#04H
0026 FF MOV R7,A
0027 E500 MOV A,c1
0029 C3 CLR C
002A 9F SUBB A,R7
002B 5003 JNC ?C0004
002D E4 CLR A
002E F500 MOV c1,A
0030 ?C0004:
0030 22 RET
; FUNCTION main (BEGIN)
; SOURCE LINE # 6
; SOURCE LINE # 7
; SOURCE LINE # 8
; SOURCE LINE # 9
; SOURCE LINE # 10
; FUNCTION main (END)
43
CODE SIZE = 63 Bytes CODE SIZE = 49 Bytes
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
INTVECTOR/NOINTVECTOR
44
缩写
IV/NOIV
参数 对中断矢量表 一个可选的偏移 在括号中
缺省
µVision2 控制
说明
INTVECTOR 0
Options - Cx51
– Misc controls:enter the directive
INTVECTOR 命令指示编译器对要求的函数产生中断矢量
矢量表不从0开始
用本命令 编译器产生一个中断矢量入口 根据ROM 命令指定的程
序存储区
NOINTVECTOR 命令禁止产生中断矢量表
工具提供中断矢量
编译器通常用一个3 字节跳转指令
量用绝对地址表示
用AJMP 或LJMP 指令跳转
需输入一个偏移
LJMP
如果
这也许用户用别的编程
产生一个中断矢量 矢
参考
(interval × n ) + offset + 3,
这里
n 中断号
interval INTERVAL命令的参数
offset INTVECTOR命令的参数
INTERVAL
缺省为8
缺省为0
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
45
例子
C51 SAMPLE.C INTVECTOR 0x8000
#pragma iv(0x8000)
C51 SAMPLE.C NOINTVECTOR
#pragma noiv
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
LARGE
46
缩写
LA
参数 无
缺省
µVision2 控制
说明
SMALL
Options – Target – Memory Model
本命令选择LARGE 存储模式
在
在8051 系统的外部数据区
求用
和存储类型无关的 在任何8051 存储范围内可以声明变量 然而
把常用的变量 如循环计数器和数组索引 放在内部数据区可以显
著提高系统性能
注意
函数调用所用的堆栈一般放在
LARGE
DPTR
存储模式 所有函数和过程的变量和局部数据段都定位
外部数据区最多可有64Kbytes 这 要
数据指针访问数据
IDATA
存储区
参考
例子
SMALL COMPACT ROM
C51 SAMPLE.C LARGE
#pragma large
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
LISTINCLUDE
47
缩写
参数 无
缺省
µVision2 控制
说明
例子
LC
NOLISTINCLUDE
Options – Listing – C Compiler Listing - #include Files
LISTINCLUDE 命令在列表文件中显示头文件的内容
不在列表文件中列出头文件
C51 SAMPLE.C LISTINCLUDE
#pragma listinclude
缺省的
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MAXAREGS
缩写 无
参数 编译器为可变长度参数列表保留的字节数
48
缺省
µVision2控制
MAXAREGS 15
MAXAREGS 40
Options - Cx51
– Misc controls:enter the directive
对SMALL和COMPACT
对LARGE
模式
模式
说明 用MAXAREGS 命令 可对参数传递的可变长度参数列表指定 缓
冲区大小
令必须在C函数前应用
MAXAREGS 定义参数的最大数目 MAXAREGS 命
本命令和传递给可重入函数的最大参数
数目没有冲突
例子
C51 SAMPLE.C MAXAREGS 20
#pragma maxaregs (4) /* allow 4 bytes for parameters */
#include <stdarg.h>
void func (char typ, ...) {
va_list ptr;
char c;
int i;
va_start (ptr, typ);
switch *typ) {
case 0: /* a CHAR is passed */
c = va_arg (ptr, char); break;
case 1: /* an INT is passed */
i = va_arg (ptr, int); break;
}
}
void testfunc (void) {
func (0, 'c'); /* pass a char variable */
func (1, 0x1234); /* pass an int variable */
}
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MOD517/ NOMOD517
缩写 无
49
参数 可选参数 在括号内 控制对
缺省
µVision2 控制
说明
NOMOD517
Options - Target
Options – Target – Use multiple DPTR registers
MOD517 命令指示Cx51 编译 器对
的硬件组成
提高整型
的函数的性能
下面的库函数利用外部数据指针
strcpy
利用算法处理器的库函数有一个 517 后缀 参考 209 页的 第八
章.库参考
用 MOD517 来指定附加参数控制 Cx51 支持 INFINEON 设备的附
加组成
如果没指定附加参数就不需要括号
和 strcmp
– Use On-Chip Arithmetic Unit
算法处理器和附加的数据指针 产生代码 本特征
长整型 和浮点数操作的性能 和利用附加数据指针
当指定后 参数必须紧跟在 MOD517 命令后的括号内
80C517
的独立组成的支持
INFINEON C517
memcpy memmove memcmp
或变种的附加
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
Directive Description
NOAU When specified, the Cx 51 Compiler uses only the
additional data pointers of the Infineon device. The
arithmetic processor is not used. The NOAU parameter is
useful for functions that are called by an interrupt while the
arithmetic processor is already being used.
NODP8 When specified, the C x 51 Compiler uses only the
arithmetic processor. The additional data pointers are not
used. The NODP8 parameter is useful for interrupt
functions declared without the using function attribute. In
this case, the extra data pointers are not used and,
therefore, do not need to be saved on the stack during the
interrupt.
用 MOD517 和 NOMOD517 指定这些附加的参数有相同的效果
NOMOD517 不产生利用 C517 或变种的附加硬件组成的代码
50
参考
例子
注意
虽然可在一个程序中定义几次
MOD517
命令只有定义在一个函数
声明外才有效
MODA2 MODAD2 MODDA MODDP2 MODP2
C51 SAMPLE.C MOD517
#pragma MOD517 (NOAU)
#pragma MOD517 (NODP8)
#pragma MOD517 (NODP8,NOAU)
C51 SAMPLE.C NOMOD517
#pragma NOMOD517
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MODA2/NOMODA2
缩写 无
参数 无
51
缺省
µVision2 控制
说明
参考
例子
NOMODA2
Options - Target
MODA2 命令指示Cx51 编译器对
的附加硬件组成
对下面的库函数用附加数据指针可以提高性能
memmove memcmp strcpy
NOMODA2命令不对利用附加的CPU 数据指针产生代码
MOD517 MODAB2 MODDP2 MODP2
C51 SAMPLE.C MODA2
#pragma moda2
C51 SAMPLE.C NOMODA2
– Use multiple DPTR registers
ATMEL 80x8252
特别的 附加的
和strcmp
数据指针 产生代码
CPU
或变种和兼容
memcpy
#pragma nomoda2
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MODAB2/NOMODAB2
缩写 无
参数 无
52
缺省
µVision2 控制
说明
参考
例子
NOMODAB2
Options - Target
MODAB2 命令指示Cx51 编译器对
器件B2系列的附加硬件资源
成代码
memcpy memmove memcmp strcpy
NOMODAB2
MOD517 MODA2 MODDP2 MODP2
C51 SAMPLE.C MODAB2
#pragma modab2
C51 SAMPLE.C NOMODAB2
– Use multiple DPTR registers
MICROCONVERTERS
特别是附加的
对下面的库函数用附加数据指针可以提高性能
命令对利用附加的CPU 数据指针不生成代码
数据指针 生
CPU
和strcmp
的模拟
#pragma nomodab2
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MODDA2/NOMODDA2
缩写 无
参数 无
53
缺省
µVision2 控制
说明
参考
NOMODDA2
Options - Target
MODDA2 命令指示 Cx51 编译器对
DS80C400和DS5240
– Use On-Chip Arithmetic Accelerator
DALLAS的DS80C390
的附加硬件资源
算法加速器 生成代码
本特征提高整型和长整型操作的性能
NOMODDA2
用下面的方法保证只有一个可执行线程使用算法加速器
用
对其余的函数用
MOD517
MODDA
程序函数使用的函数
命令对利用片内算法加速器不生成代码
命令编译保证只在主程序执行或只被一个中断服务
NOMODDA
命令编译
例子
C51 SAMPL390.C MODDA
#pragma modda
C51 SAMPL390.C NOMODDA
#pragma nomodda
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MODDP2/NOMODDP2
缩写 无
参数 无
54
缺省
µVision2 控制
说明
参考
例子
NOMODDP2
Options - Target
MODDP2命令指示 Cx51编译器对
C530 C550
的
可以提高性能
strcmp
NOMODDP2
MOD517 MODA2 MODP2
C51 SAMPL320.C MODDP2
#pragma moddp2
C51 SAMPL320.C NOMODDP2
CPU
数据指针
– Use multiple DPTR registers
或变种及兼容器件的附加硬件资源 特别是附加
生成代码 对下面的库函数用附加数据指针
memcpy memmove memcmp strcpy
命令对利用附加的 CPU数据指针不生成代码
DALLAS的80C320
C520
和
#pragma nomoddp2
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
MODP2/NOMODP2
缩写 无
参数 无
55
缺省
µVision2 控制
说明
参考
例子
NOMODP2
Options - Target
MODP2 命令指示Cx51 编译器对一些
变种的附加
8051
的库函数用附加数据指针可以提高性能
memcmp strcpy
NOMODP2
MOD517 MODA2 MODAB2 MODDP2
C51 SAMPLE.C MODP2
#pragma modp2
C51 SAMPLE.C NOMODP2
– Use multiple DPTR registers
PHILIPS或ATMELWM
寄存器
DPTR
和strcmp
命令对利用双DPTR 指针不生成代码
双数据指针 生成代码 对下面
的
memcpy memmove
#pragma nomodp2
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
NOAMAKE
56
缩写
参数 无
缺省
µVision2 控制
说明
例子
NOAM
产生
AUTOMAKE
本命令不能在
NOAMAKE 不使能由Cx51 编译器产生的
信息记录
用
NOAMAKE 生成的
上
C51 SAMPLE.C NOAMAKE
#pragma NOAM
信息
µVision2.
同时不使能寄存器优化信息
内使用
文件可用在旧版本的
OBJ
AUTOMAKE PROJECT
开发工具
8051
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
NOEXTEND
缩写 无
参数 无
57
缺省
µVision2 控制
说明
例子
允许所有的语言扩展
在
Options – C51 – Misc Controls
NOEXTEND 控制命令编译器只处理
言扩展不使能
并产生编译错误或警告
C51 SAMPLE.C NOEXTEND
#pragma NOEXTEND
保留关键词如bit
输入
NOEXTEND
ANSI C
reentrant 和using 将不认识
语言结构 Cx51 语
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
OBJECT/NOOBJECT
58
缩写
参数 一个任意的包括路径的文件名
缺省
µVision2 控制
说明
例子
OJ/NOOJ
OBJECT
Options – Output - Select Folder for Objects
OBJECT( filename )命令用提供的名称命名OBJ 文件
文件使用源文件的文件名和.OBJ 扩展名
NOOBJECT 控制禁止产生一个OBJ文件
C51 SAMPLE.C OBJECT sample1.obj
#pragma oj(sample1.obj)
C51 SAMPLE.C NOOBJECT
filename
.OBJ
缺省的
OBJ
#pragma nooj
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
OBJECTADVANCE
59
缩写
参数 无
缺省
µVision2 控制
说明
OA
无
Options – C51 – Code Optimization – Linker Code Packing
OBJECTADVANCED 命令指示编译器在OBJ 文件中包含连接器
程序的优化信息
本命令用在用OPTIMIZE 命令连接时 用来
减少程序大小和执行速度
当使能时
择下面的优化
优化级 连接器优化表现
0-7
OBJECTADVANCED
AJMP/ACALL最大化
AJMP和 ACALL指令最大化 AJMP和 ACALL指令
LJMP和LCALL
比
8
9
10
11
重复使用共同入口代码 当一个函数有多个调用时
设置代码可重复使用 重复使用共同的入口代码 减
少程序大小 本优化在全部的应用中执行
公共块子程序 循环指令系列转换成子程序 这可
减少程序大小但要稍增加执行时间 本优化在全 部
应用中执行
重排代码 当检测到公共块子程序 代码重排以得
到最多的循环序列
公共出口代码的复用 固定的出口序列被复用 这
可进一步减少公共块子程序的大小 本优化可产 生
最紧凑的程序代码
命令指示
只短的多
LX51
连接器/定位器选
连接器重新安排代码段使
参考
例子
OPTIMIZE OMF2
C51 SAMPLE.C OBJECTADVANCED DEBUG
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
OBJECTEXTEND
60
缩写
参数 无
缺省
µVision2 控制
说明
参考
OE
无
Options – Output – Debug Information
OBJECTEXTEND 命 令指示编译器在生成的OBJ 文件中包含附
加的变量类型
内相同名字的目标
定义信息 这些附加的信息用来标识不同范围
以便于被各种模拟和仿真器区别
注意
用本命令产生的
的扩展集 仿真器必须提供增强的
不能确定
DEBUG OMF2
不要使用
文件包含一个可重定位的
OBJ
OBJ
OBJECTEXTEND
格式规格
OBJ
加载器来使用本特征 如果
OMF-51
例子
C51 SAMPLE.C OBJECTEXTEND DEBUG
#pragma oe db
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
ONEREGBANK
61
缩写
参数 无
缺省
µVision2 控制
说明
例子
OB
无
在
不用using 属性指定 在中断入口Cx 51 选择寄存器组0这在中断
服务程序的口头执行
属性的高优先级中断可以中断使用不同的寄存器组的低优先级中
断
如果应用中中断只用一个寄存器组 应使用
令
C51 SAMPLE.C ONEREGBANK
#pragma OB
Options – C51 – Misc controls
用MOV PSW
这模拟
MOV PSW #0
指令
输入
ONEREGBANK
#0 指令
这确保没使用using
ONEREGBANK
命
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
OMF2
62
缩写
O2
参数 无
缺省
C51
是 Cx 51 编译器的缺省
µVision2控制
说明
Project – Select Device – Use LX51 instead of BL51
OMF2 命令使能
检查和排除
当要用下面的
可变组
XDATA ROM
编译器缺省的生成
OMF2
INTEL OMF51
Cx 51编译器
VARBANKING
用
在ROM
INTEL OMF51
文件格式
文件格式
它对模块提供详细的符号类型
文件格式的历史限制
特征之一时需要OMF2 文件格式
命令使能使用
const xdata
存储类型指定的XDATA变量定位
存储类型
far
OMF2
文件格式
RAM字符串
远的空间
相连模式
的390 和变种的相连模式
OMF2 文件格式要求扩展的
参考
例子
OBJECTEXTEND
C51 SAMPLE.C OMF2
#pragma O2
STRING
命令指定字符串常数定位在xdata 或更
ROM D521K和ROM D16M
连接/ 定位器 不能用 BL51 连接/ 定位器
LX51
命令使能DALLAS
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
OPTIMIZE
63
缩写
OT
参数 一个括号内的0到9间的十进制数 另外
或OPTIMIZE
SPEED
可用来选择优化重点是放在代码大小
或放在执行速度
缺省
µVision2 控制
说明
OPTIMIZE 8 SPEED
Options – C51 – Code Optimization
OPTIMIZE 命令设置优化级别和重点
注意
每个更高的优化级别包含低优化级别的所有特征
级别 说明
0 常数合并 编译器 在计算时 只要可能 就用常
数代替表达式 这包括运行地址计算
OPTIMIZE SIZE
优化简单访问 编译器优化访问8051 系统的内部数
据和位地址
跳转优化 编译器 经常扩展跳转最终目标 多次
跳转被删除
1 死代码删除 没用的代码段被删除
拒绝跳转 严密的 检查条件跳转 以确定是否可
以倒置测试逻辑来改进或删除
2 数据覆盖 适合静态覆盖的数据和位段是确定的
并内部标识 BL51 连接/ 定位器可以 通过全局数
据流分析 选择可被覆盖的段
3 PEEPHOLE 优化 清除多余的 MOV 指令 这包括不必
要的存储区目标加载和常数加载 当存储空间或
执行时间可节省时 用简单操作代替复杂操作
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
级别 说明
4 寄存器变量 如有可能 自动变量和函数参数定
位在寄存器上 为这些变量保留的存储区就省略
了
优化扩展访问 IDATA XDATA PDATA和CODE的变
量直接包含在操作中 在多数时间中间寄存器是
没必要的
局部公共子表达式删除 如果用一个表达式重复的
进行相同的计算 则保存第一次计算结果 后面
有可能就用这结果 多余的计算就被删除
CASE/SWITCH 优化 包含 SWITCH 和 CASE 的代码优化
为跳转表或跳转队列
5 全局公共子表达式删除 一个函数内相同的子表达
式有可能就只计算一次 中间结果保存在寄存器
中 在一个新的计算中使用
64
简单循环优化 用一个常数填充存储区的循环程序
被修改和优化
6 回路循环 如果结 果程序代码更快和有效则程序
回路循环
7 优化扩展的索引访问 当适当时对寄存器变量用
DPTR 指针和数组访问对执行速度和代码大小优
化
8 公共的尾部合并 当一个函数有多个调用 一些设
置代码可以复用 因此减少程序大小
9 公共块子程序 检测循环指令序列 并转换成子程
序 Cx51 甚至重排代码以得到更大的循环序列
OPTIMIZE 级别 9 包括 0 到 8 的所有优化级别
例子
C51 SAMPLE.C OPTIMIZE 9
C51 SAMPLE.C OPTIMIZE 0
#pragma ot(6,SIZE)
#pragma ot(size)
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
ORDER
65
缩写
参数 无
缺省
µVision2 控制
说明
例子
OR
变量是无序的
Options – C51 – Keep Variables in Order
ORDER 命令指示C x 51 编译 器根据变量在C源文件的定义顺序在
存储区中排序
使Cx 51 编译变慢
C51 SAMPLE.C ORDER
#pragma OR
ORDER不使能 C编译器使用
HASH
算法
本命令
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
PAGELENGTH
66
缩写
参数 括号中一个十进制数 最大为
缺省
µVision2 控制
说明
参考
例子
PL
PAGELENGTH 60
Options – Listing – Page Length
PAGELENGTH 命令指定列表文件中每页打印的行数
页60行
PAGEWIDTH
C51 SAMPLE.C PAGELENGTH 70
#pragma pl(70)
包括头和空行
65535
缺省使每
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
PAGEWIDTH
67
缩写
参数 括号中的一个十进制数 范围在78到
缺省
µVision2 控制
说明
参考
例子
PW
PAGEWIDTH 132
Options – Listing – Page Width
PAGEWIDTH 命令指定列表文件 中每行的字符数
符数的将被分成两行或多行
PAGELENGTH
C51 SAMPLE.C PAGEWIDTH 79
#pragma pw(79)
132
间
多于指定字
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
PREPRINT
68
缩写
参数 括号中的一个可选的文件名
缺省 不产生预处理器列表
µVision2 控制
说明
PP
Options – C51 – C Preprocessor Listing
PREPRINT 命令指示 编译器产生一个预处理器列表
扩展
一个用源文件名和.I 扩展名的文件
个预处理器输出文件
注释被删除 如果用了不带参数的PREPRINT 就产生
注意
PREPRINT
命令指定
例子 C51 SAMPLE.C PREPRINT
命令只能在命令行指定 不能在C源文件中用
缺省
宏调用被
C x51 编译器不产生一
#pragma
C51 SAMPLE.C PP PREPRO.LST
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
PRINT/NOPRINT
69
缩写
参数 括号中的一个可选的文件名
缺省
µVision2 控制
说明
例子 C51 SAMPLE.C PRINT CON
PR/NOPR
PRINT filename .LST
Options – Listing – Select Folder for List Files
编译器对每个编译的程序产生一个列表 扩展名为 .LST 用
PRINT命令
NOPRINT
#pragma pr(\usr\list\sample.lst)
C51 SAMPLE.C NOPRINT
可以重新指定列表文件名
命令禁止编译器产生一个列表文件
#pragma nopr
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
REGFILE
70
缩写
参数 括号中的一个文件名
缺省 无
µVision2 控制
说明
例子
RF
Options – C51 – Global Register Coloring
REGFILE 命令指示C x 51 编译器用一 个寄存器定义文 件优化全 局
寄存器
信息
局寄存器的优化
C51 SAMPLE.C REGFILE sample.reg
#pragma REGFILE(sample.reg)
寄存器定义文件指定外部函数对寄存器的使用 用这些
C x 51 编译器可以优 化通用寄存器的使用
本特征使能全
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
REGISTERBANK
71
缩写
参数 括号中的一个0到3的数字
缺省
µVision2 控制
说明
RB
REGISTERBANK 0
在
Options – C51 – Misc controls
REGISTERBANK 命令对在源文件中声明的后来的函数选择哪组
寄存器组
式的寄存器访问
效果
注意
和
using
返回一个值给调用者的函数必须和调用者使用相同的寄存器组 如
果寄存器组不同
当绝对寄存器号可以计算时 结果代码可使用绝对形
using 函数属性取代REGISTERBANK 命令的
函数属性不同
REGISTERBANK
返回值可能会在错误的寄存器组中
输入REGISTERBANK 命令
控制不切换寄存器组
例子
REGISTERBANK
个函数声明中使用本命令将被忽略
C51 SAMPLE.C REGISTERBANK 1
#pragma rb(3)
命令在一个源程序中可以多次出现 然而 在一
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
REGPARMS/NOREGPARMS
缩写 无
参数 无
72
缺省
µVision2 控制
说明
REGPARMS
在
Options – C51 – Misc controls
REGPARMS 命令指示编译器为在寄存器中传递三个函数参数生
成代码
数在存储区中快的多
传递
NOREGPARMS 命令强制所有函数参数在固定存储区中传递
令产生的参数传递代码和C51 的版本2 和版本1 兼容
注意
在一个源程序中可指定
允许建立一些程序段用寄存器参数
不必重新汇编或编译 用
文件
这类参数传递类似于用汇编编写的代码 比存储函数参
不能定位在寄存器中的参数用固定存储区
REGPARMS和NOREGPARMS
这在下面的例子程序中说明
中输入REGPARMS命令
另外的段用老式的参数传递
NOREGPARMS
可访问旧的汇编函数或库
本命
命令多次 这
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
#pragma NOREGPARMS /*Parm passing-old method */
extern int old_func(int,char);
#pragma REGPARMS /* Parm passing-new method */
extern int new_func(int,char);
main() {
char a;
int x1,x2;
x1 = old_func(x2,a);
x1 = new_func(x2,a);
}
73
例子
C51 SAMPLE.C NOREGPARMS
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
RET_PSTK REG_XSTK
74
缩写
参数 无
缺省
µVision2 控制
说明
RP RX
无
在
Options – C51 – Misc controls
命令
RET_PSTK 和RET_XSTK 命令引起返回地址使用pdata 或xdata
重入堆栈
命令指示编译器产生代码从硬件堆栈中
在指定的重入堆栈中
RET_PSTK
RET_XSTK
注意
可用
RET_xSTK
有选择的使用在包含深度堆栈嵌套的模块中
正常情况 返回地址保存在
使用COMPACT模式重入堆栈
使用LARGE 模式重入堆栈
命令从片内或硬件堆栈卸载返回地址 这些命令可
中输入RET_PSTK,RET_XSTK
的硬件堆栈中 这些
8051
出返回地址
POP
并存储
如果用了这些命令中的其中之一 必须在启动代码中初始化重入堆
栈指针
如何初始化重入堆栈参考
151
页的
STARTUP.A51
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
1 #pragma RET_XSTK
2 extern void func2(void);
3
4 void func(void) {
5 1 func2();
61 }
ASSEMBLY LISTING OF GENERATED OBJECT CODE
;FUNCTION func(BEGIN)
0000 120000 E LCALL ?C?CALL XBP
;SOURCE LINE #5
0003 120000 E LCALL func2
0006 020000 E LJMP ?C?RET_XBP
;FUNCTION func(END)
75
;SOURCE LINE #6
例子
C51 SAMPLE.C RET_XSTK
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
ROM
缩写 无
76
参数
缺省
µVision2 控制
说明
SMALL COMPACT LARGE D521K
或
D16M
ROM LARGE
Options – Target – Code Rom Size
使用ROM 命令指定程序存储区的大小 本命令影响
JMP和CALL
指令的代码
选项 说明
SMALL CALL 和JMP 指令和ACALL 和AJMP 一样编码 最大程
序大小为2K 字节 整个程序必须定位在2K 字节程
序存储区内
COMPACT CALL 指令和LCALL 一样编码 JMP 指令和同一函数
内的AJMP 一样编码 一个函数的大小不能超过2K
字节 整个程序可最大到64K 字节 应用的类型
决定是否ROM COMPACT 比ROM LARGE 有利
用ROM COMPACT 节省代码空间必须根据经验决
定
LARGE CALL 和JMP 和LCALL 和LJMP 一样编码 这允许使用
整个代码空间 没有如何限制 程序大小限制到
64K字节 函数大小也限制到 64K字节
D521K
†
Dallas 390和变
种
D16M
†
Dallas 390和变
种
产生19 位的ACALL 和AJMP 指令 最大的程序大小
为521K 字节 本模式只对DALLAS 390 和兼容设备
有效
产生24 位LCALL 指令和19 位AJMP 指令 最大程序
大小为16M 字节 本模式只对DALLAS 390 和兼容
设备有效
参考
例子
† D521K 和 D16M 选项要求 OMF2 命令
SMALL COMPACT LARGE
C51 SAMPLE.C ROM SMALL
#pragma ROM(SMALL)
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
SAVE/RESTORE
缩写 无
参数 无
77
缺省
µVision2 控制
说明
例子
无
本命令不能在命令行指定
SAVE命令保存 AREGS REGPARMS的当前设置
OPTIMIZE级和重点
后来用RESTORE 命令恢复
存
RESTORE
SAVE
命令从保存堆栈中恢复
命令最大的嵌套深度是8级
例如 这些设置在一个#include 命令前保
命令保存的值
SAVE
注意
SAVE和RESTORE
只能作为
#
pragma
的一个参数指定 不能在命令
行指定本控制选项
#pragma save
#pragma noregparms
和当前
extern void test1(char c,int I);
extern char test2(long l,float f);
#pragma restore
在上面的例子中
是不使能的
通过寄存器传递参数对两个外部函数test1 和test2
SAVE 命令时的设置被RESTORE 命令恢复
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
SMALL
78
缩写
参数 无
缺省
µVision2 控制
说明
SM
SMALL
Options – Target – Memory Model
本命令选择SMALL 存储模式 把所有函数变量和局部数据段放
在8051 系统的内部数据存储区
存储模式的地址空间受限
无论什么存储模式 都可以声明变量在任何的
而
把最常用的命令 如循环计数器和队列索引 放在内部数据区
可以显著的提高系统性能
这使访问数据非常快 但SMALL
8051
存储区范围 然
注意
函数调用所用的堆栈通常放在
IDATA
存储区
参考
例子
在开始时常用
明确的的存储区定义
COMPACT LARGE ROM
C51 SAMPLE.C SMALL
#pragma small
SMALL
存储模式 但应用变大时 在变量声明时用
可以放置大的变量和数据在别的存储区
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
SRC
缩写 无
参数 括号内的一个可选的文件名
缺省 无
79
µVision2 控制
说明
参考
可以在
在PROJECT 窗口-文件表中右键点击文件
选择Options for… 打开Options – Properties page
使能Generate Assembler SRC file
用SRC 建立一个汇编源文件 而不是一个OBJ 文件 这源文件可
用A51 汇编器汇编
如果括号中没指定外文件名 就用C源文件的名字和路径 和
的扩展名
µVision2 中设置如下
.SRC
注意
编译器不能同时产生一个源文件和一个
ASM ENDASM
OBJ
文件
例子
C51 SAMPLE.C SRC
C51 SAMPLE.C SRC SML.A51
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
STRING
80
缩写
参数
缺省
µVision2 控制
说明
ST
CODE XDATA
STRING CODE
在 Options – C51 – Misc controls 中输入命令 STRING
STRING命令可以指定固定字符串的存储类型
定的放在代码区
void main(void) {
printf(“hello world\n”);
}
用STRING 命令可以改变字符串的位置
为现有的程序可能使用存储区类型指针访问字符串
到xdata 或far 存储区
扩展的8051 系列如PHILIPS 80C51MX 非常有用
例如
或
FAR
缺省的 字符串固
hello world
在应用中应避免使用code banking 本选项对
如下位于代码区
本选项必须谨慎使用 因
把字符串定位
选项 说明
CODE 固定的字符串放在 CODE 区 这是 Cx51 的缺省设
置
XDATA 固定的字符串放在 CONST XDATA区
FAR
†
† XDATA 和 FAR 选项要求 OMF2 命令
参考
OMF2 XCROM
固定的字符串放在CONST FAR 区
例子 C51 SAMPLE.C STRING(XDATA)
#pragma STRING(FAR)
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
SYMBOLS
81
缩写
SB
参数 无
缺省
µVision2 控制
说明
不产生符号列表
Options – Listing – C Compiler Listing – Symbols
SYMBOLS
在列表文件中
控制编译器产生所有的程序模块的符号列表 列表包含
每个符号都列出存储种类 类型 偏移 和大小
例子 C51 SAMPLE.C SYMBOLS
#pragma SYMBOLS
下面的列表文件摘录了一段符号列表
NAME CLASS MSPACE TYPE OFFSET SIZE
==== ===== ====== ==== ====== ====
EA . . . . . . . . ABSBIT ----- BIT 00AFH 1
update . . . . . . PUBLIC CODE PROC ----- -----
dtime. . . . . . PARAM DATA PTR 0000H 3
setime . . . . . . PUBLIC CODE PROC ----- -----
mode . . . . . . PARAM DATA PTR 0000H 3
dtime. . . . . . PARAM DATA PTR 0003H 3
setuptime. . . . AUTO DATA STRUCT 0006H 3
time . . . . . . . * TAG * ----- STRUCT ----- 3
hour . . . . . . MEMBER DATA U_CHAR 0000H 1
min. . . . . . . MEMBER DATA U_CHAR 0001H 1
sec. . . . . . . MEMBER DATA U_CHAR 0002H 1
SBUF . . . . . . . SFR DATA U_CHAR 0099H 1
ring . . . . . . . PUBLIC DATA BIT 0001H 1
SCON . . . . . . . SFR DATA U_CHAR 0098H 1
TMOD . . . . . . . SFR DATA U_CHAR 0089H 1
TCON . . . . . . . SFR DATA U_CHAR 0088H 1
mnu. . . . . . . . PUBLIC CODE ARRAY 00FDH 119
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
USERCLASS
82
缩写
参数
UCL
mspace = user_classname
mspace涉及变量或程序代码所使用的缺省的存储区
mspace
CODE 程序代码
CONST CODE空间的变量 CONST类
XCONST CONST XDATA空间的常数 XDATA类
XDATA XDATA空间的变量 XDATA类
HDATA
HCONST
User_classname 是一个存储类的名称 类名可以用如何可用的标识符
说明
扩展FAR 空间的变量
扩展CONST FAR 空间的常数
HDATA 类
缺省 段接收缺省的类名
µVision2 控制
在Options – C51 – Misc controls 输入USERCLASS 命令
说明如下
HCONST 类
说明
USERCLASS命令
Cx51编译器用基类名来定义段
位器级被引用
HDATA_FLASH
完整模块中的基类名
存储类只有在使用OMF2 格式和扩展LX51 连接/ 定位器中可用
例子 C51 UCL.C
#pragma userclass (xdat = flash)
#pragma userclass (hconst = patch)
int xdata x1[10]; //XDATA_FLASH
const char far tst[] = “Hello”; //HCONST_PATCH
对一个编译器产生的段指定一个类名 缺省的
用户类名在扩展的
LX51
连接/定
用一个类名定位所有的段 例如
来指定存储区
USERCLASS 命令修改一个
但不包括可覆盖段
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
VARBANKING
83
缩写
VB
参数 无 不修改中断代码
1
在中断代码中保存SFR 的扩展地址
缺省 使用标准C51 库
µVision2 控制
说明
Options – Target – ‘far’ memory type support.
Options –
Target – save address extension SFR in interrupts.
VARBANKING 命令允许在传统的8051 中用 FAR 存储区
就会选支持FAR 存储区的不同的库函数集
时
在
XBANKING.A51
XBANKING.A51
VARBANKING 1
复代码
SFR
定
XBANKING.A51
扩展地址的地址
在中断函数的开头加入
中配置用
在中断函数对
MOV ?C?XPAGE1SFR ?C?XPAGE1RST
变量访问函数 参考
FAR
中定义的符号 ?
SFR
的初始值用符号
SFR
的扩展地址增加保存和恢
C?XPAGE1SFR
?C?XPAGE1RST
指令
但使能
154
页的
指定
指
例子
注意
只有C模块中用
复
的扩展地址 如果应用中包含别的汇编模块或库的中断函
SFR
数
必须仔细的检查这些函数
在\KEIL\C51\EXAMPLES\FARMEMORY\中的例子说明如何使用
C51 FAR
C51 SAMPLE.C VARBANKING
C51 MYFILE.C VARBANKING 1
存储类型在传统的
VARBANKING 1
8051
命令编译的中断函数保存和恢
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
WARNINGLEVEL
84
缩写
参数 数字0 到2
缺省
µVision2 控制
说明
例子
WL
WARNINGLEVEL 2
Options – C51 – Warnings
WARNINGLEVEL
信息
告警级别 说明
2
缺省 列出所有的告警信息 包括未使用变量 表达
C51 SAMPLE.C WL 1
命令允许抑制编译器告警 参考 第7章.错误
0 不使能大多数的编译器告警
1 只列出可能产生不正确代码的告警
式 或标号告警
#pragma WARNINGLEVEL(0)
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
XCROM
85
缩写
XC
参数 无
缺省
µVision2 控制
说明
参考
例子
所有XDATA变量在起始代码中初始化
在
XCROM
在
代码存储区
有些新的
XDATA
替代
OMF2 STRING
#pragma XCROM // Enable const xdata ROM
Options – C51 – Misc controls
命令指示编译器保存常数变量在
CODE
区 这些变量必须用
8051
提供一个存储管理单元 允许影射
存储区
RAM
对传统的
8051
中输入 XCROM命令
XDATA
CONST XDATA
XDATA
对
声明 这可不占用
空间 应该用
存储区 而不是
ROM
空间到
ROM
设备
/*
* The following text will be in a ROM that
* is addressed in the XDATA space.
*/
const char xdata text[] = “Hello world\n”;
void main(void) {
printf(text);
}
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
86
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
87
Keil Software – Cx51 编译器用户手册—第二章 用 Cx51 编译器编译
88
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
ྯᐺ Ꭻዔ౫ᐱ
89
Cx 51 编译器提供几种 ANSI 标准 C 的扩展
存储区
存储区类型
存储模型
存储类型说明符
变量数据类型说明符
位变量和位可寻址数据
SFR
指针
函数属性
下面各节详细说明
关键字
为了利用8051 的许多特性
Cx51 编译器在C语言的范围内加了许多新的关键字
以支持 8051 结构 这些扩展有
at
alien idata sfr
bdata interrupt sfr16
bit large small
code pdata
compact
data reentrant xdata
可以用 NOEXTEND 控制命令取消这些扩展 参考 17 页的 第二章 .用 Cx51 编译
far sbit
task
priority
using
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
存储区
90
8051 结构支持几个物理分开的程序和数据的存储区或存储空间
的和不利的方面
这些存储空间可能
每个存储区都有有利
可读不可写
可读写
读写比别的存储空间快
和这些不同的是 对多数的大型机 小型机 和微型机来说 程序 数据和常数
都放在机内相同的存储空间内
可参考Intel 8
位嵌入式处理器
手册或别的
8051
数据
手册
程序存储区
程序
者在外部
最多可以有64K 字节的程序存储区 程序代码 包括所有的函数和库 保存在程
序存储区
CODE
在Cx 51 编译器中 可用code 存储区类型标识符来访问程序存储区
存储区是只读的 他不能写 程序存储区可能在8051CPU 内 或
或者都有 根据8051 派生的硬件决定
常数变量也是
8051 可执行程序只保存在程序存储区
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
内部数据存储区
8051CPU 内部的数据存储区是可读写的 8051 派生系列最多可有256 字节的内部
数据存储区
到0xFF
因为可以用一个8 位地址访问 所以内部数据区访问很快 然而 内部数据区最
多只有256 字节
低128 字节内部数据存储区可直接寻址 高128 字节数据区 从0x80
只能间接寻址 从20H 开始的16 字节可位寻址
91
内部数据区可以分成三个不同的存储类型
data存储类型标识符通常指低128 字节的内部数据区
idata存储类型标识符指内部的256 个字节的存储区
比直接寻址慢
bdata 存储类型标识符指内部可位寻址的16 字节存储区
区域声明可位寻址的数据类型
data idata
和bdata
存储的变量直接寻址
但是 只能间接寻址 速度
20H 到2FH
可以在本
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
外部数据存储区
外部数据区可读写 访问外部数据区比内部数据区慢 因为外部数据区是通过一个数
据指针加载一个地址来间接访问的
几种8051 系列增加片内XRAM 用和传统的外部数据区一样的指令访问 这些空间用
专用的SFR 配置寄存器使能
外部数据区最多可有64K 字节 当然 这些 地址不是必须用做存储区 硬件设计可 能
把外围设备影射到存储区
备
这可参考I/O 的存储区影射
C x 51 编译器提供两种不同的存储类型访问外部数据 xdata 和pdata
存储类型标识符指外部数据区64K 字节内的任何地址
xdata
和外部空间重叠
如果是这种情况 程序可以访问外部数据区和控制外围设
92
存储类型标识符仅指一
pdata
COMPACT 模式
中关于
pdata
1
的资料
页或256 字节的外部数据区 参考95 页的
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
FAR存储区
93
FAR 存储区指许多新的8051 变种的扩展地址空间
针访问扩展存储区
变量和
PHILIPS 51MX 结构用通用指针可支持
80C51MX 结构的新指令访问
DALLAS 390 结构在CONTIGIOUS 模式用一个 24位DPTR 寄存器和传统的MOVX
和MOVC 指令支持扩展的code 和xdata 地址 空间
于这些扩展的xdata 和code 地址空间
传统的8051 系列也可用far 和const far 变量 如果配置XBANKING.A51 这对提
供一个地址扩展SFR 或附加存储空间可以影射到xdata 空间的系列很有用
xdata banking 硬件扩展传统8051 系列的地址空间
XBANKING.A51
ROM
中的常数
两个Cx 51存储类型
far和const far
8Mb
变量
Cx 51编译器用普通的 3字节指
far和 const far
和
code
xdata
用far 和const far 定义的变量位
访问扩展
空间
C x 51 编译器用
参考154 页的
RAM
也可用
中的
注意
需要指定
C51
指示
OMF2
和扩展
连接/定位器使用
LX51
far和far const
存储类型
特殊功能寄存器 SFR 存储区
8051 提供128 字节的SFR 存储区 SFR 有位
器
计数器 串口 并口 和外围设备 参考101 页的
字节 或字寄存器 用来控制计时
SFR
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
存储模式
存储模式定义缺省的存储类型 用在 函数参 数 自动变量 和没有直接声明存储类型
的变量上
定存储模式
注意
除了在很特殊的应用中
用明确的存储类型标识符声明一个变量 可以重载缺省的存储模式指定的存储类型
参考95页的 存储类型
SMALL模式
在
C x 51 编译器命令行中用SMALL COMPACT 和LARGE 控制命令指
参考20 页的 控制命令
SMALL
存储模式产生最快和最有效的代码
94
在本模式中 所有的变量 缺省的情况下 位于
用data 存储类型标识符明确声明的一样
而
所有的东西 包括堆栈必须放在内部
决于函数嵌套的深度
SMALL
盖
模式是最好的模式
典型的 如果连接/定位器配置为内部数据区变量可覆
在本模式中 变量访问非常有效 然
RAM
8051
系统的内部数据区 这和
中 堆栈大小是 不确定的 它取
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
COMPACT模式
COMPACT
用
pdata
用
址计划
SMALL
模式快
COMPACT
当用
存储区
使用多于256 字节的外部存储区
这种情况 必须初始化PORT2 以使用正确的外部存储页 这可在 起始代码中
实现
模式 所有变量 缺省的 都放在外部数据区的一页中 这就象
声明的一样
它通过寄存器R0和
模式有效
R0 和R1 是字节寄存器
这存储模式可提供最多
R1
@R0 @R1
因此 变量访问不是很快 然而
模式
C x 51 编译器用以@R0 和 @R1 为操作数的指令访问外部
只提供地址的低字节 如果COMPACT模式
高字节地址 或页 由8051 的PORT2 提供
同时必须为连接器指定PDATA的起始地址
256
字节的变量 限制是由于用了寻
间接寻址 本存储模式不如
COMPACT
模式比
95
LARGE
参考
151
STARTUP.A51
页
中的配置P2为
COMPACT
模式
LARGE模式
LARGE
在
这和用xdata 存储类型标识符明确声明的一样 数据指针
址
问机制比
模式 所有变量 缺省的 放在外部数据存储区 可到
通过这指针访问存储区是低效的 特别是对两个或多个字 节的 变量 这种访
SMALL或COMPACT
模式产生更多的代码
64K
DPTR
字节
用做寻
存储类型
C x 51 编译器明确支持8051和派生系列结构
可以明确的和特定的存储空间相关连
访问内部数据区比访问外部数据区快的多 基于这个原因 把频繁使用的变量放在内
部数据区
把较大的 较少使用的变量放在外部存储区
可访问8051 的所有存储区 每个变量
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
明确声明存储类型
在变量声明中包含一个存储类型标识符 可以指定变量的存放区域
下面的表综合了可用的存储类型标识符
存储类型 说明
code
data
idata
bdata
xdata
far
pdata
signed和unsigned
用
程序存储区
直接寻址内部数据区 访问变量速度最快
间接寻址内部数据区 可访问全部内部地址空间
位寻址内部数据区 支持位和字节混合访问
外部数据区
扩展的
RAM和ROM
特定的芯片扩展
分页
256
属性 在变量声明中可以包括存储类型标识符
字节
64K
字节
64K
字节
存储空间 最多
PHILIPS 80C51MX DALLAS 390
外部数据区 由
MOVC @A+DPTR
用
MOVX @DPTR
由
16MB
MOVX @Rn
访问
128
字节
256
字节
16
字节
访问
由用户定义程序或
访问
访问
96
例子
char data var1;
char code text[] = "ENTER PARAMETER:";
unsigned long xdata array[100];
float idata x,y,z;
unsigned int pdata dimension;
unsigned char xdata vector[10][4][4];
char bdata flags;
注意
为了和以前的
明
编译器兼容 应该在数据类型前指定存储区 例如 下面的声
C51
data char x
等同于
char data x
但是 这个特征可能不能用在新的程序中 因为它和将来新的
联
在同时使用旧的
data char *x
语法和存储标识符指针时应小心 在这种情况下 定义
C51
等同于
char *data x
Cx51
编译器关
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
暗含的存储类型
如果在变量声明中省略存储类型标识符 自动选择缺省或暗含的存储类型 不能置
于寄存器中的函数参数和自动变量也存放在缺省存储区中
97
缺省存储类型由 SMALL
COMPACT 和 LARGE 编译器控制命令定义
参考 94 页
存储模式
数据类型
C x 51 编译器提供一些基本的数据类型用在 C 程序中 C x 51 编译器支持标准 C 数据
类型和 8051 平台独特的数据类型
数据类型 位 字节 值范围
†
bit
signed char
usnigned char
enum
signed short
usnigned short
signed int
unsigned int
signed long
unsigned long
float
†
sbit
†
sfr
†
sfr16
†
bit sbit sfr
1
8 1
8 1
8/16
16 2
16 2
16 2
16 2
32 4
32 4
32 4
1
8 1
16 2
和 sfr16 数据类型在 ANSI C 中没有 是
这些数据类型在下面的节中有详细描述
下表列出了可用的数据类型
0到 1
-128到 +127
0到 125
1或 2 -128到 +127或 -32768
到 +32767
-32768到 +32767
0到 65535
-32768到 +32767
0到 65535
-2147483648到
+2147483647
0到 4294967295
±1.175494E-38到
±3.402823E+38
0到 1
0到 255
0到 65535
Cx51 编译器中独有的
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
BIT 类型
98
C x 51 编译器提供一个 bit 数据类型
用
一个 bit 变量和别的 C 数据类型的声明相似 例如
static bit done_flag = 0; /* bit variable */
bit testfunc ( /* bit function */
bit flag1, /* bit arguments */
bit flag2)
{
.
.
.
return (0); /* bit return value */
可能在变量声明 参数列表 和函数返回值中有
所有的 bit 变量放在 8051 内部存储区的位段 因为这区域只有 16 字节长 所以在某
个范围内只能声明最多 128 个位变量
存储类型应包含在一个 bit 变量的声明中 但是 因为 bit 变量存储在 8051 的内部数
据区
只能用 data 和 idata 存储类型 别的存储类型不能用
bit 变量和 bit 声明的限制如下
禁止中断的函数
函数不能返回一个位值
#pragma disable
Cx51编译器对这类函数想要返回一个 bit类型产生一个
和用一个明确的寄存器组
错误信息
一个位不能被声明为一个指针 例如
bit *ptr;/ * invalid */
不能用一个bit 类型的数组 例如
bit ware[5]; /* invalid */
using n
声明的
Keil Software – Cx51 编译器用户手册—第三章 语言扩展
可位寻址目标
位可寻址目标是可作为字或位寻址的目标 只有占用 8051 内部存储区可位寻址的数
据目标符合条件
且
用 bdata 存储类型声明的变量必须是全局的 必须如下声明变量
int bdata ibase; /* Bit-addressable int */
char bdata bary[4]; /* Bit-addressable array */
Cx 51 编译器在这位可寻址区域用 bdata 存储类型声明变量
99
而
变量 ibase 和 bary 是位可寻址的
用 sbit 关键词声明新的变量可访问用 bdata 声明的变量的位 例如
sbit mybit0 = ibase^0; /* bit o of ibase */
sbit mybit15 = ibase^15; /* bit 15 of ibase */
sbit Ary07 = bary[0]^7; /* bit 7 of bary[0] */
sbit Ary37 = bary[3]^7; /* bit 7 of bary[3] */
上面的例子只是声明
号后的表达式指定位的位置
char 和 unsigned char 的范围是 0 到 7 int unsigned int short
是 0 到 15
在别的模块中 应该对 sbit 类型提供外部变量声明 例如
extern bit mybit0; /* bit 0 of ibase */
extern bit mybit15; /* bit 15 of ibase */
extern bit Ary07; /* bit 7 of bary[0] */
extern bit Ary37; /* bit 7 of bary[3] */
long 和 unsigned long 是 0 到 31
并不分配上面声明的 ibase 和 bary 变量的位 例子中
因此 这些变量的每个位是可直接访问和修改的
这表达式必须是常数 范围由声明中的基变量决定
符
^
和 unsigned short
声明中包含 sbit 类型
位变量
参考 101 页的
要求基目标用存储类型 bdata 声明 唯一的例外是特殊功能
SFR