|
C51和汇编混合编程 |
|
1. C语言中嵌入汇编 1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM ; Assembler Code Here #pragma ENDASM 2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File” 和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态; 3、根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最 后文件; 4、编译,即可生成目标代码。 来个实例吧:
#i nclude <reg51.h> void main(void) { P2=1; #pragma asm MOV R7,#10 DEL:MOV R6,#20 DJNZ R6,$ DJNZ R7,DEL #pragma endasm P2=0; } 2 . 无参数传递的函数调用
C51调用汇编函数
1.无参数传递的函数调用 先来个例子:其中example.c和example.a51为项目中的两个文件 ***********************example.c*********************************************** extern void delay100(); main() DELAY100: 3. 有参数传递的函数调用 在写这片文章之前,写了个试验程序,但总是通不过,查看汇编代码发现c文件中的语句根本没有被编译进去,怎么也找不到原因,郁闷~~
最后在网上搜了个试验程序,把我的程序复制过去,可以编译成功,奇怪了,在我的project里就是不行,我注意到我的project编译后出现一条WARNING: *** WARNING L7: MODULE NAME NOT UNIQUE MODULE: 8.obj (8) 而同样的程序代码在另外一个project中没有WARNING,肯定是这条WARNING语句导致的,里面提到NAME,难道和名字有关,马上把A51文件改个名字(原来c文件和a51文件名字一样),编译,哈哈,WARNING不见了,查看汇编代码,一切按预想的进行,唉,一个名字害得我不浅啊,记住哦,c文件和A51文件不能使用同一个文件名,不过我还不知道为什么会这样,有高手知道得话请告知,还是进行今天的作业吧! 今天说说带参数传递的函数调用,在C51和汇编之间传递参数的方式有两种,一种是通过寄存器传递参数,C51中不同类型的实参会存入相应的寄存器,在汇编中只需对相应寄存器进行操作,即达到传递参数的目的。 不同类型的数据及其传递参数的寄存器如下表所示:
举个例子吧,void delay(unsigned char i, unsigned int j) 当执行语句delay(10,1000)时,10会存入R7中,1000高位会存入R4中,低位存入R5中。在汇编语句中从这几个寄存器中取数,再进行操作就行了,说起来也很简单的嘛,呵呵~ 来个最简单的实例吧,没什么意义,傻瓜式的程序: ****************************main.c********************************************* main()
{ DELAY(10,1000); while(1); } **********************DELAY.A51******************************************** ?PR?_DELAY?DELAY SEGMENT CODE PUBLIC _DELAY RSEG ?PR?_DELAY?DELAY _DELAY: DJNZ R4,$ DJNZ R5,$ DJNZ R7,$ RET END 还要说的是,函数名前要加下划线,表示是有参数传递的函数调用! 4. 函数的返回值传递参数
(2)函数返回值所用的寄存器
实例: ********************main.c**************************************** unsigned int example(unsigned char i) { return(i*i); } main() |