Keil C51中嵌入汇编
深入剖析keilc51---从汇编到c51
深入剖析keilc51---从汇编到c51C插入汇编语句#pragma asmljmp 0#pragma endasm如果就这样直接编译的话,会出现以下错误:error C272: 'asm/endasm' requires src-control to be active解决方法:在 Files T oolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assemble SRC File 的勾选由灰色变为黑色,即使这两项有效!第一节 main()函数和启动代码汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接。
下面看看它和main()函数是如何编译的;//主函数如下;void main(void){while (1) 这是个无条件空循环。
{}}把上面的main()函数编译后的汇编程序和反汇编代码整理后对照如下;C_C51STARTUP SEGMENT CODEPR?main?TESTMAIN SEGMENT CODESTACK SEGMENT IDATARSEG ?STACKDS 1CSEG AT 0C_STARTUP: LJMP STARTUP1C:0x0000 020003 LJMP STARTUP1(C:0003)RSEG ?C_C51STARTUPSTARTUP1: ;该段程序把内存清零; MOV R0,#IDATALEN - 1C:0x0003 787F MOV R0,#0x7F; CLR AC:0x0005 E4 CLR A; MOV @R0,AIDATALOOP:C:0x0006 F6 MOV @R0,A; DJNZ R0,IDATALOOPC:0x0007 D8FD DJNZ R0,IDATALOOP(C:0006); MOV SP,#?STACK-1 ;设制CPU的堆栈起始地址C:0x0009 758107 MOV SP(0x81),#0x07; LJMP ?C_STARTC:0x000C 02000F LJMP main(C:000F)RSEG ?PR?main?TESTMAINmain:; void main(void)C:0x000F 80FE SJMP main(C:000F) ;main()函数现在分析上面的汇编程序就会明白c51程序是如何启动的。
KEIL C51 中 C语言加入汇编语言的使用方法
KEIL C51 中C语言加入汇编语言的使用方法
51单片机2008-06-03 18:20:42 阅读22 评论0字号:大中小
1.通过使用预处理指令#asm 和#endasm来使用汇编语言。
用户编写的汇编语言可以紧跟在#asm之后,而在#endasm之前结束。
如下所示:
#asm
/*汇编源程序*/
#endasm
在#asm和#endasm之间的语句将作为汇编语言的语句输出到由编译器产生的汇编语言文件中。
2.通过使用预处理指令# pragma asm和函数_asm()来使用汇编语言。
在程序的开头加上预处理指令#pragma asm,在该预处理指令之前只能有注释和其它预处理指令。
_asm()函数可按以下方式使用。
_asm(汇编语言字符串)
在汇编语言字符串中,可以通过回车和换行符把各个语句分开。
在C语言中使用汇编语言,可以操作C语言中的全局变量或完成用C语言难于完成的功能,但要注意以下几点:
①#asm不允许嵌套使用。
②当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件。
③ _asm只能用小写字母,如果写成大写,就作为普通变量。
④#asm#endasm和_asm只能用在函数内。
Keil C51中嵌入汇编
转载请注明出处谢谢
Keil C51中嵌入汇编
我们知道,用C语言实现精确延时是一件比较困难的事情,而用汇编写精确延时程序就简单多了,但是整个程序都用汇编,那就是件头疼的事情。
要是能在C里面嵌入汇编,那就爽了,本文介绍的就是如何在Keil C51里嵌入汇编。
1、在C 文件中以如下方式加入汇编代码:
#pragma ASM
; Assembler Code Here
#pragma ENDASM
例如:
//延时1ms程序晶振:11.0592MHZ
void delay_1ms(void)
{
#pragma asm
DELAY1MS: MOV R7,#50
DD: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,DD
#pragma endasm
}
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右
边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色
(有
效)状态。
如图所示。
3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件。
4、编译,即可生成目标代码。
KEILC51中C语言加入汇编语言的使用方法
KEILC51中C语言加入汇编语言的使用方法一、为什么使用汇编语言?汇编语言是一种底层的编程语言,其主要目的是实现对硬件的直接控制,具有高度灵活性和效率。
在开发单片机程序时,通常使用高级语言来编写大部分的代码,但是在一些特定的情况下,使用汇编语言能够更好地满足需求,例如对一些硬件寄存器的操作、实现高速计算等。
二、C语言与汇编语言相结合的方法在KEILC51中,可以通过使用内联汇编或者使用汇编模块的方式将C 语言与汇编语言相结合。
1.内联汇编内联汇编是将汇编代码直接嵌入到C语言代码中。
使用内联汇编可以获得更高的性能和灵活性,但也增加了代码的可读性和可维护性。
在C语言中使用内联汇编需要使用__asm关键字,并在括号中编写要嵌入的汇编代码。
以下是一个示例:```void delay(unsigned int count)__asmMOVR1,loop:INCR1CJNE R1, count, loop}```在上述示例中,使用了__asm关键字将一段简单的汇编代码嵌入到了C函数delay中,以实现一个延时功能。
2.汇编模块另一种将C语言与汇编语言相结合的方法是使用汇编模块。
汇编模块是一个独立的文件,其中包含了汇编语言代码。
可以通过使用extern关键字将C语言代码与汇编模块连接起来。
首先,需要创建一个汇编模块的文件,例如delay.asm,其中包含了要实现的汇编代码:```; delay.asmPUBLIC delaydelay PROCMOVR1,loop:INCR1CJNE R1, R2, loopRETdelay ENDP```在上述示例中,创建了一个名为delay的汇编函数,该函数实现了一个简单的延时功能。
接下来,在C语言代码中使用extern关键字声明要调用的汇编函数:```// main.cextern void delay(unsigned int count);void maindelay(1000);```在上述示例中,使用extern关键字声明了一个名为delay的汇编函数。
关于在 KEIL C51 中直接嵌入汇编
我找到了一些资料希望对你有用下周就要做实验了,由于听老师说机房位子可能比较少,对我这种蹭课的学生来说也就不敢奢望同选这门课的同学一样能够正常的在机房调试程序了,因此,我决定提前先在自己的工作室里把实验内容给过一遍。
第一个实验是关于嵌入式编程的,这个实验目的一方面是为了让我们熟悉ARM下编程的编译环境ADS和调试器ATX,另一方面是让我们掌握如何将c语言和汇编语言在实际编程中相互调用。
经过这两天靠自己不断的摸索,终于掌握了如何在编译环境中进行ARM编程,另外,还学会了在c中调用汇编程序的方法,以及如何通过linux自带的gcc编译嵌有汇编的c程序,总之,收获还是蛮多的哦,下面就总结一下吧。
1、c嵌汇编首先说一下关于GCC编译嵌有汇编语言的c语言吧,GCC编译的汇编语言不是我们上课时学的Intel x86汇编,而是AT&T汇编,两者的区别可以查看《Gcc使用的内嵌汇编语法格式小教程》。
下面是内嵌汇编的几种格式:语法__asm__(“instruction. ……instruction”); //Linux gcc中支持(注意asm的下划线均为两个否则GCC将会无法编译)__asm{instruction…instruction}; //ADS中支持(注意asm的下划线均为两个否则GCC将会无法编译)asm(“instruction [; instruction]”); //ARM C++中使用例1是我在linux环境下,编的嵌有汇编程序的c语言,并通过了GCC的编译:例1:#includeint plus(int a,int b){__asm__(“add %1,%0\n\t”:”+r”(a):”r”(b));return (c);}int main(){int a,b,c;a=2;b=1;c=plus(a,b);printf(“c=%d\n”,c);}这个程序应该是很简单的,但关键是子函数中嵌入的那段汇编程序,具体的写法可以参看其他文章。
C51与汇编混合编程.
在 C51 中可以通过直接插入“#prapma asm/endasm”预处理指令,实现汇编语言程序的内嵌。具体步 骤如下:
① 在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma asm 汇编语句 #pragma endasm
② 在 Project 窗口中包含汇编代码的 C 文件上右击,选择“Options for ...”命令,单击右边的“Generate
;_AD0809 为函数名,“_”表明有参数在寄存器内部传递
PUBLIC _AD0809
;用“PUBL IC”声明该函数
;可以被其他模块调用 RSEG ? PR ? _AD0809 ? ADC0809 ;AD0809 子程序代码段起始位置
_AD0809:
MOV A,R1 MOV R0,A
;R1 传递数组 adc_data[8]首址
将汇编语言程序编写成与 C51 函数类似的独立文件,独立于 C51 程序文件之外,然后将其加入到 Keil C51 项目文件中。在 Keil C51 编译器中,提供了 C51 与汇编语言程序的接口规则,要求在 C51 中必须先声明(定 义)要调用的独立汇编语言程序名,并且要求独立汇编语言程序与 C51 函数一样,具有明确的边界、参数、 返回值和局部变量,这些规则保证了汇编语言能够正确地被 C51 调用。具体如下:
R6,#250
DJNZ R6,$
DJNZ R6,$DEL
#pragma endasm
P10=0;
// 设 P1.0 口为低电平,点亮 LED
for (n=0;n<20000; n++)
// 延时
P10=1;
// 设 P1.0 口为高电平,熄灭 LED
KEIL C51所支持的C语言和汇编语言混合编程的方法
介绍一下KEIL C51所支持的C语言和汇编语言混合编程的方法!51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。
因此在编程时更加要注重程序的执行效率及编程上的技巧处理,最大限度的发挥其性能,满足项目开发的实际需要。
在嵌入式开发中,C语言具有可移植性强和可读性好等优点,而汇编语言的高效、快速及可直接对硬件进行操作等优点又是C语言所难以达到的,本帖为大家介绍一下KEIL C51所支持C和汇编混合编程的方法,将这两种语言的优点完美的结合,更大限度的发挥51单片机的性能,加快我们的产品开发周期!如用此方法实现6时钟(6T)的51单片机对320kbps mp3文件的流畅播放,就是这种混合编程的方法的一个很好的应用实例!下面就为大家介绍一下混合编程的方法。
所谓混合编程,就是在一个项目中,同时使用C和汇编两种语言。
C语言和汇编语言混合编程的方法形式多样,可以是以汇编语言为主体,在其中内嵌入部分C语言;也可以是以C语言为主体在其中加入部分汇编语言(此方法实用价值较高,而被工程师们广泛的采用)。
在此方法中,用汇编语言编写对有关硬件的驱动和处理、复杂的算法、实时性要求较高等底层的东西,来满足单片机对某些硬件高效、快速、精确的处理等性能上的要求。
用C语言来编写程序的主体部分。
这样就将C语言的可移植性强和可读性好与汇编语言的高效、快速及可直接对硬件进行操作等优点相结合。
两者优劣互补、相得益彰,加快我们产品的开发周期,具有极高的现实意义和实用价值!在KEIL C51中加入的汇编代码需按照其编译器中约定的规则才可以实现C语言程序对汇编代码的调用。
即KEIL C51的命名规则和参数传递规则。
一、KEIL C51的命名规则在KEIL C51中,编译器对C语言程序中的函数会自动的进行转换,转换规则如下表:函数属性函数举例段中的函数名无参数或无寄存器参数传递的函数 void func1(void) func1含通过寄存器传递的参数 void func2(int) _func2可重入函数 void func3(char)reentrant _?func3二、KEIL C51函数的参数传递规则(一)通过寄存器传递的函数参数表参数长度第1个形参第2个形参第3个形参1字节(char) R7 R5 R32字节(int) R6(H) R7 R4(H) R5 R2(H) R33字节(通用指针) R1(H)~R34字节(long) R4(H)~R7(二)函数返回值使用的寄存器列表返回类使用的寄存器位数据(bit)位累加器CY1字节(char)R72字节(int)R6(H) R73字节(通用指针)R3(类型)R2(H) R14字节(long)R4(H)~R74字节(float)R4(H)~R7,32位IEEE格式,指数和符号位在R7在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法。
Keil 内联汇编的设置问题
在keil C语言与汇编语言的混合编程中曾经遇到过的一些问题,写下来留作以后参考。
(本文写于09.08.15,在8.18日加入了第4点的内容)1、C语言中加入汇编语言模块的方法:例子:void func(){C语言代码……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasmC语言代码……}其中红色为C语言部分,绿色为嵌入的汇编语言部分。
汇编部分需要用#pragma asm和#pragma endasm包起来2、Keil提示“asm/endasm”出错的解决方法如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...sendata.c(81): error C272: 'asm/endasm' requires src-control to be active sendata.c(87): error C272: 'asm/endasm' requires src-control to be active Target not created解决方法如下:首先左键单击包含有汇编部分的c语言文件名,然后在菜单栏中选择Project->Option for File‘……’中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
3、?C_START等相关警告的处理按照2中的方法处理完之后,再编译不会出现错误信息了,但是会出现如下的警告信息:linking...*** WARNING L1: UNRESOLVED EXTERNAL SYMBOLSYMBOL: ?C_STARTMODULE: STARTUP.obj (?C_STARTUP)*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL: ?C_STARTMODULE: STARTUP.obj (?C_STARTUP)ADDRESS: 000DH处理方法如下:在如上图所示的“Source Group 1”上点右键,在菜单中选择“Add Files to Group 'Source Group 1' ”找到你的KEIL安装目录,选择其中的“C51”目录下的“LIB”目录下的“C51S.LIB”文件,点击Add,然后Close即可。
Keil C51中汇编的应用
□张春龙
【摘 要】 C 语言直接嵌入汇编、 C 与汇编的相互调用等。 文章主要讨论了 Keil C51 使用汇编时的常用调试命令 、 在线汇编、 【关键词】 Keil C51 ; 汇编语言; 编写程序 【作者单位】 张春龙, 黑龙江生态工程职业学院
C 语言已成为单片机应用系统主流的编程工具, C 目前, 语言具有代码可移植性好 、 可靠性高、 易于维护的优点。 在 德国 KEII 公司推出基于 WINDOWS 平台功能强大的 51 系列 μVision 单片机集成开发工具之后, 更加体现了这一趋势, 采 用 C 语言几乎可以完成所有汇编语言的工作, 能够大大提高 程序的开发效率, 但是在一些特殊的应用场合, 仍然需要用 汇编语言进行编写程序 。 一、 常用调试命令 对工程成功的进行汇编 、 连接之后, 使用菜单 Debug → Start / Stop Debug Session 或者按 Ctrl + F5 即可进入调试状态, Keil 内建立了一个仿真 CPU 用来模拟执行程序, 该仿真 CPU 功能强大, 能够在没有硬件和仿真机的情况下, 进行调试程 序。使用菜单 STEP 或使用快捷键 F11 或相应的命令按钮, 可以实现单步执行程序, 使用菜单 STEOVER 或功能键 F10 , 能够实现以过程单步的形式执行命令 。 所谓过程单步, 就是 指将高级语言中的函数或汇编语言中的子程序, 作为一个语 。 句进行全速执行 二、 在线汇编 在进入 Keil 的调试环境后, 若发现程序有错, 可以对源 程序进行直接修改, 但要使修改后的代码执行起作用, 就必 须先退出调试环境, 进行重新编译、 连接, 再进入调试。 如果 仅需对源程序进行临时的修改, 或只需要对某些程序行进行 测试, 上述的过程就未免显得麻烦, 因此 Keil 软件提供了在 然 线汇编的能力。首先将光标定位于需要修改的程序行上, 后用菜单 Debug → Inline Assembly, 会出现一个对话框, 在对 话框 Enter New 后面的缩缉框内, 直接输入需更改的程序语 句, 输入完后敲击回车键, 将会自动指向下一条语句执行, 可 以继续修改。若不需要再修改, 可以点击右上角的关闭按钮 来关闭窗口。 C 语言直接嵌入汇编 三、 在 C 和汇编的混合编程中, 有一种简单的方法, 可以在 C “project / options fog roupsoure 语言中直接嵌入汇编指令, 即在 group” “Assemble SRC file ” “generate assemb窗口一栏选中 和 ler SRC file” 两项内容的前提下, 采用预处理命令#pragma asm 和#pragma endasm。同时, 还需将库文件填加到目标文件的 项目组中, 如果在“SMALL ” 编译模式下, 需将 KEII / C51 / LIB C51S. LIB 路径下的 文件填加到目标文件的项目组里, 进行 这些操作后, 编译才不会出错. h > void main( void) { unsigned j; #pragma asm MOV A, #02 M0V P2 A RL A MOV P2 A #pragma endasm i = 8} #pragma as 可以在 C 程序中的任意一 在上面的例程中, 行出现, 该方法为 C 语言程序中嵌入汇编, 提供了一种简易 可行的方法。 C 程序调用汇编 四、 ( 一) C 文件格式 #include < reg52. h > unsigned int y) ; unsigned int add( unsigned int x, void main( ) { unsigned int z; z = add( 53 , 530 ) ; } ( 二) 汇编文件格式。 ? PR? _ADD? ADDMOD SEGMENT CODE; 声明函数代 PUBLIC_ADD; 程序段及数据段的开始地址 RSEG? PR? _ADD? ADDMOD _ADD: MOV A, R5 ADD A, R7 MOV R7 , A MOV A, R4 ADDC A, R6 MOV R6 , A RET END 当利用寄存器传递参数时, 在汇编中定义函数时, 要用 “_函数名” 。 来定义函数 五、 在汇编程序中调用 C 程序( 下转第 254 页)
Keil C嵌入汇编的几个问题
一//<asm.h>#ifdef ASMunsigned long shiftR1(register unsigned long);#elseextern unsigned long shiftR1(register unsigned long);#endif//end of asm.h//<asm.c>#define ASM#include <asm.h>#include <reg52.h>#pragma OT(4,speed)unsigned long shiftR1(register unsigned long x){#pragma asmclr cmov a,r4rrc amov r4,amov a,r5rrc amov r5,amov a,r6rrc amov r6,amov a,r7rrc amov r7,a#pragma endasmreturn(x);}//end of asm.c将此源文件加入要编译的工程文件,将光标指向此文件,选择右键菜单“option for file 'asm.c'”,将属性单“properties”中的“Generate Assembler SRC File”“Assemble SRC File”两项设置成黑体的“√”将“Link Public Only”的“√”去掉,再编译即可。
用此方法可以在c源代码的任意位置用#pragma asm和#pragma endasm嵌入汇编语句。
但要注意的是在直接使用形参时要小心,在不同的优化级别下产生的汇编代码有所不同,可以察看对应的.lst文件看一看,得到正确的优化级别后,#pragma OT(x,speed)锁定优化级别(这里的值是0-9)。
二看了许多keil c51中嵌入汇编的帖子,根据自己的经验在keil7.01环境中总结如下:1、把"xx.c"加入工程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler SRC File”和“Assemble SRC File”打上黑勾有效;2、根据选择的编译模式,把相应的库文件象加"xx.c"一样加入工程中并放在"xx.c"下面,如smail模式下选择"keil\c51\lib\c51s.lib"加入工程中,如果要进行浮点运算把"keil\c51\lib\c51fpl.lib"也加入工程中。
(完整word版)keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程1. C语言中嵌入汇编1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM;Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assem bler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;4、编译,即可生成目标代码。
来个实例吧:#i nclude <reg51.h>void main(void){P2=1;#pragma asmMOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DEL#pragma endasmP2=0;}2 . 无参数传递的函数调用C51调用汇编函数1.无参数传递的函数调用先来个例子:其中example.c和example.a51为项目中的两个文件***********************example.c***********************************************extern void delay100();main(){delay100;}***********************example.a51***********************************************?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段PUBLIC DELAY100; //声明函数RSEG ?PR?DELAY100; //函数可被连接器放置在任何地方DELAY100:MOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DELRETEND在example.c文件中,先声明外部函数,然后直接在main中调用即可。
用Keil在C中嵌入汇编
有时候用到需要精确延时之类的子程序时,用C语言比较难控制,这时候就可以在C中嵌入汇编比较常用的keil中嵌入汇编的方法如下所示:如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL 就知道这中间的一段是汇编了。
在有加入汇编的文件中,还要设置编译该文件时的选项Generate Assembler SRC File 生成汇编SRC文件Assemble SRC File封装汇编文件(如图三的状态为选中)选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。
为了能对汇编进行封装还要在项目中加入相应的封装库文件,在笔者的项目中编译模式是小模式所以选用C51S.LIB。
这也是最常用的。
这些库文件是中KEIL安装目录下的LIB目录中。
加好后就可以顺利编译了。
(注:我只在7.0以上版本使用过)汇编与C语言混合编程的关键问题1 C程序变量与汇编程序变量的共用为了使程序更易于接口和维护,可以在汇编程序中引用与C程序共享的变量:.ref_to_dce_num,_to-dte_num,_to_dce_buff,_to_dte_buff在汇编程序中引用而在C程序可直接定义的变量:unsigned char to_dte_buff[BUFF_SIZE];//DSP发向PC机的数据int to_dte_num;//缓冲区中存放的有效字节数int to_dte_store;//缓冲区的存放指针int to_dte_read;//缓冲区的读取指针这样经过链接就可以完成对应。
2 程序入口问题在C程序中,程序的入口是main()函数。
而在汇编程序中其入口由*.cmd文件中的命令决定,如:-e main_start;程序入口地址为main _start。
这样,混合汇编出来的程序得不到正确结果。
因为C到ASM 的汇编有默认的入口c-int00,从这开始的一段程序为C程序的运行做准备工作。
c51中嵌套汇编的方法
怎么样在c程序中使用汇编编程方法一:(void)
{
asmmovr0,#0dfh
asmdo_resetdata:
asmmov@r0,#00h
asmdjnzr0,do_resetdata
return;
}
方法二:把asm作为关键字后续汇编用大括号括起来即可。如下:
#else
externunsignedlongshiftR1(registerunsignedlong);
#endif
//endofasm.h
//
#defineASM
#include
#include
#pragmaOT(4,speed)
unsignedlongshiftR1(registerunsignedlongx)
{
#pragmaasm
clrc
mova,r4
rrca
movr4,a
mova,r5
rrca
movr5,a
mova,r6
rrca
movr6,a
mova,r7
rrca
movr7,a
#pragmaendasm
return(x);
}
//endofasm.c
将此源文件加入要编译的工程文件,
将光标指向此文件,选择右键菜单optionforfileasm.c,
voidreset_data(void)
{
asm
{movr0,#0dfh
do_resetdata:
mov@r0,#00h
djnzr0,do_resetdata
}
return;
}
keilc6.20c直接嵌入汇编的方法
混合编程的基本方式, 在C51中嵌入汇编程序
混合编程的基本方式,在C51中嵌入汇编程序在单片机应用系统设计中,过去主要采用汇编语言开发程序。
汇编语言编写的程序对单片机硬件操作很方便,编写的程序代码短,效率高,但系统设计的周期长,可读性和可移植性都很差。
C语言程序开发是近年来单片机系统开发应用所采用的主要开发方式之一,C 语言功能丰富、表达能力强、使用灵活方便、开发周期短、可读性强、可移植性好。
但是,采用C 语言编程还是存在着如对硬件没有汇编方便、效率没有汇编高、编写延时程序精确度不高等缺点,因而现在单片机系统开发中经常用到C 语言与汇编语言混合编程技术。
混合编程技术可以把C 语言和汇编语言的优点结合起来,编写出性能优良的程序。
单片机混合编程技术通常是,程序的框架或主体部分用C 语言编写,对那些使用频率高、要求执行效率高、延时精确的部分用汇编语言编写,这样既保证了整个程序的可读性,又保证了单片机应用系统的性能。
1、混合编程的基本方式C 语言与汇编语言混合编程通常有两种基本方法:在C 语言中嵌入汇编程序和在C 语言中调用汇编程序。
1.1 在C51 中嵌入汇编程序在C51 中嵌入汇编程序主要用于实现延时或中断处理,以便生成精练的代码,减少运行时间。
嵌入式汇编通常用在当汇编函数不大,且内部没有复杂的跳转的时候。
在单片机C 语言程序中嵌入汇编程序是通过C51 中的预处理指令# pragmaasm/endasm 语句实现,格式如下:#pragmaASM;汇编程序代码#pragmaENDASM通过# pragma asm 和# pragma endasm 告诉C51 编译器它们之间的语句行不用编译成汇编程序代码。
1.2 在C51 中调用汇编程序。
51单片机 KEIL汇编嵌入C语言,程序防干扰设计,TIMER0作为软件清狗,TIMER2设置为串口波特率发生器
;***************************
;*
*
;*
初始化程序
*
;*
*
;****************************
CLEARMEMIO:
CLR A
;清 A
DEC A
;A 为#0FFH
MOV P1,A
;端口置 1
MOV P2,A
;端口置 1
MOV P3,A
;端口置 1
MOV SP,#70H
LCALL INT_SERIAL_RX
RETI
NOP
NOP
NOP
LJMP ERR
;软件陷阱
;****************************
; INT_T1 定时器 1 中断程序 ;
;****************************
INT_T1:
NOP
NOP
LCALL INT_TIMER1
关键的 C 函数 KEIL_ASM_C_INC.C 程序 如下所述: #pragma code small #include<reg52.h> #define uchar unsigned char sbit LED_T0=P1^0; sbit LED_T1=P1^1; sbit PIN_WDI=P3^4; //变量定义 uchar temp,count0=0,count1,count_s; uchar flag_S=0,flag_P=0,flag_N=0; /*************************************************** 11059200[12*(65536-19456)]=11059200/(12*46080)=1/20 函数功能:TIMER0 初始化,Timer0 清看门狗,50ms 产生中断 入口参数:void **************************************************/ void init_timer0(void) {
KEILC51程序中如何嵌入汇编
KEILC51程序中如何嵌⼊汇编模块内接⼝:使⽤如下标志符:asm汇编语句endasm注意:如果在程序中使⽤了,注意在Keil编译器中需要激活Properties中的“Generate Assembler File” 和“Assembler File ”两个选项1、把"xx.c"加⼊⼯程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler File”和“Assemble SRC File”打上⿊勾有效;2、根据选择的编译模式,把相应的库⽂件象加"xx.c"⼀样加⼊⼯程中并放在"xx.c"下⾯,如smail模式下选"keil\\lib\s.lib"加⼊⼯程中,如果要进⾏把"keil\c51\lib\c51fpl.lib"也加⼊⼯程中。
即:在 Keil 安装⽬录下的 \C51\LIB\ ⽬录的LIB ⽂件如下:C51S.LIB - 没有的 Small moC51C.LIB - 没有的 Compact moC51L.LIB - 没有浮点运算的 moC51FPS.LIB - 带浮点运算的 Small modelC51FPC.LIB - 带浮点运算的 Compact modelC51FPL.LIB - 带浮点运算的 model3、在"xx.c"头⽂件中加⼊优化:⽐如 (4,speed)4、在"xx.c"中加⼊汇编代码#pragma ASM;Assembler Code Here#pragma ENDASM5、编译⽣成xx.hex例:#include<reg52.h>void delay(void){#pragma asmR5,#5DEL:R6,#2DEL1:R7,#255DJNZ R7,$DJNZ R6,DEL1DJNZ R5,DEL;MOV A,P1; A;MOV P1,A#pragma endasm}void delay1(unsigned int cnt){while(cnt--);}void main(){while(1){delay1(1000);P1=0x55;delay();}}有时候⽤到需要精确延时之类的⼦程序时,⽤C语⾔⽐较难控制,这时候就可以在C中嵌⼊汇编⽐较常⽤的keil中嵌⼊汇编的⽅法如下所⽰:如图⼀,在C⽂件中要嵌⼊汇编的地⽅⽤#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的⼀段是汇编了。
(完整word版)keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程1. C语言中嵌入汇编1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM;Assembler Code Here#pragma ENDASM2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assem bler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;4、编译,即可生成目标代码。
来个实例吧:#i nclude <reg51.h>void main(void){P2=1;#pragma asmMOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DEL#pragma endasmP2=0;}2 . 无参数传递的函数调用C51调用汇编函数1.无参数传递的函数调用先来个例子:其中example.c和example.a51为项目中的两个文件***********************example.c***********************************************extern void delay100();main(){delay100;}***********************example.a51***********************************************?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段PUBLIC DELAY100; //声明函数RSEG ?PR?DELAY100; //函数可被连接器放置在任何地方DELAY100:MOV R7,#10DEL:MOV R6,#20DJNZ R6,$DJNZ R7,DELRETEND在example.c文件中,先声明外部函数,然后直接在main中调用即可。
keilC语言中加入汇编
keilC语言中加入汇编C51下加入汇编代码使用如下标志符:#pragma asm;汇编语句#pragma endasm注意:Keil编译器中需要激活Properties中的“Generate Assembler SRC File” 和“Assembler SRC File ”两个选项以下举例:1、把"xx.c"加入工程中,右击"xx.c"选择“options for file"xx.c" 选择“Generate Assembler SRC File”和“Assemble SRC File”打上黑勾有效;2、根据选择的编译模式,把相应的库文件象加"xx.c"一样加入工程中并放在"xx.c"下面,如smail模式下选"keil\c51\lib\c51s.lib"加入工程中,如果要进行浮点运算把"keil\c51\lib\c51fpl.lib"也加入工程中。
在Keil 安装目录下的\C51\LIB\ 目录的LIB 文件如下:C51S.LIB - 没有浮点运算的Small modelC51C.LIB - 没有浮点运算的Compact modelC51L.LIB - 没有浮点运算的Large modelC51FPS.LIB - 带浮点运算的Small modelC51FPC.LIB - 带浮点运算的Compact modelC51FPL.LIB - 带浮点运算的Large model3、在"xx.c"头文件中加入优化:比如#pragma OT(4,speed)4、在"xx.c"中加入汇编代码#pragma ASM;Assembler Code Here#pragma ENDASM5、编译生成xx.hex注意:没有做第一步会有如下警告:'asm/endasm' requires src-control to be active没有做第二步会有如下警告:UNRESOLVED EXTERNAL SYMBOL;REFERENCE MADE TO UNRESOLVED EXTERNAL等没有做第三步会有如下警告:UNDEFINED SYMBOL (PASS-2)用Keil在C中嵌入汇编很多用C语言编单片机程序的朋友,有时候会碰上“精确延时”,而用C又要搞清楚它的编译,往往在这个时候就想到了用汇编来编写延时,具体怎么在C中嵌入汇编呢?其实也比较简单,如下图,在C 文件中要嵌入汇编的地方用#pragma asm和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的一段是汇编了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
转载请注明出处谢谢
Keil C51中嵌入汇编
我们知道,用C语言实现精确延时是一件比较困难的事情,而用汇编写精确延时程序就简单多了,但是整个程序都用汇编,那就是件头疼的事情。
要是能在C里面嵌入汇编,那就爽了,本文介绍的就是如何在Keil C51里嵌入汇编。
1、在C 文件中以如下方式加入汇编代码:
#pragma ASM
; Assembler Code Here
#pragma ENDASM
例如:
//延时1ms程序晶振:11.0592MHZ
void delay_1ms(void)
{
#pragma asm
DELAY1MS: MOV R7,#50
DD: MOV R6,#10
D2: DJNZ R6,$
DJNZ R7,DD
#pragma endasm
}
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右
边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色
(有
效)状态。
如图所示。
3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件。
4、编译,即可生成目标代码。