第四章 Keil C51高级编程
本章讨论以下内容:
●绝对地址访问
●C与汇编的接口
●C51软件包中的通用文件
●段名转换与程序优化
第一节 绝对地址访问
C51提供了三种访问绝对地址的方法:
1. 绝对宏:
在程序中,用“#include
CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
具体使用可看一看absacc.h便知
例如:
rval=CBYTE[0x0002];指向程序存贮器的0002h地址
rval=XWORD [0x0002];指向外RAM的0004h地址
2. _at_关键字
直接在数据定义后加上_at_ const即可,但是注意:
(1)绝对变量不能被初使化;
(2)bit型函数及变量不能用_at_指定。
例如:
idata struct link list _at_ 0x40;指定list结构从40h开始。
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始
提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。
3. 连接定位控制
此法是利用连接控制指令code xdata pdata \\data bdata对“段”地址进行,如要指定某
具体变量地址,则很有局限性,不作详细讨论。
第二节 Keil C51与汇编的接口
1. 模块内接口
方法是用#pragma语句具体结构是:
#pragma asm
汇编行
#pragma endasm
这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中。
2. 模块间接口
C模块与汇编模块的接口较简单,分别用C51与A51对源文件进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。
(1) 通过寄存器传递函数参数
最多只能有3个参数通过寄存器传递,规律如下表:
参数数目 Char Int long,float 一般指针 1 R7 R6 & R7 R4~R7 R1~R3 2 R5 R4 & R5 R4~R7 R1~R3 3 R3 R2 & R3 R1~R3 (2) 通过固定存储区传递(fixed memory)
这种方法将bit型参数传给一个存储段中:
?function_name?BIT
将其它类型参数均传给下面的段:?function_name?BYTE,且按照预选顺序存放。
至于这个固定存储区本身在何处,则由存储模式默认。
(3) 函数的返回值
函数返回值一律放于寄存器中,有如下规律:
Return type Registev 说明 Bit 标志位 由具体标志位返回 char/unsigned char R7 单字节由R7返回 1_byte指针 int/unsigned int R6 & R7 双字节由R6和R7返回,MSB在R6 2_byte指针 long&unsigned long R4~R7 MSB在R4, LSB在R7 Float R4~R7 32Bit IEEE格式 一般指针 R1~R3 存储类型在R3 高位R2 低R1 (4) SRC控制
该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。
keilc 详细中文手册



