KEILC51中C语言加入汇编语言的使用方法
- 格式:docx
- 大小:37.18 KB
- 文档页数:3
深入剖析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语言加入汇编语言的使用方法
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中嵌入汇编
我们知道,用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、编译,即可生成目标代码。
keil c语言转汇编
在Keil C中,可以使用内置的编译器和调试器将C语言代码转换为汇编代码。
以下是将C语言代码转换为汇编代码的步骤:
1.打开Keil C并创建一个新的C项目。
2.在项目中创建一个C源文件(.c文件),并将的C代码写在这个文件中。
3.在Keil C的菜单栏中,选择“Project” > “Options for Target”。
4.在弹出的对话框中,选择“C/C++”选项卡。
5.在“C Compiler”下拉菜单中,选择要使用的编译器。
通常情况下,可以选择“ARM”或“C51”编译器,具体取决于的目标硬件。
6.在“Output”下拉菜单中,选择“Assemble only”选项。
这将指示编译器只生成汇编代码而不进行编译。
7.点击“OK”保存设置。
8.在Keil C的菜单栏中,选择“Project” > “Build Target”。
这将使用选定的编译器将的C代码编译为汇编代码。
9.编译过程完成后,打开生成的目标文件(.obj文件)。
10.在目标文件中,将找到已转换为汇编代码的C代码。
可以使用文本编辑器打开目标文件并查看其中的汇编代码。
请注意,转换后的汇编代码可能会被优化和重排,以适应目标硬件的要求。
因此,生成的汇编代码可能与在C源文件中编写的代码有所不同。
Keil中c语言和汇编语言混合编程1 模块内接口在C51程序内部调用汇编语句的方法是用#pragma语句,具体结构如下:#pragma asm汇编语句行#pragma endasm这种方法实质是通过asm与endasm告诉c51编译器中间行不用编译,是汇编语句行而不是c 语言语句,因而在编译控制指令中有SRC指令以空盒子将这些不用编译的行存入其中。
下面介绍在c51程序内直接嵌入汇编代码的方法:(1)在c文件中将要嵌入的汇编代码按照图1添加到源文件中。
(2)在Project窗口中用鼠标右击包含汇编代码的c文件,在弹出的快捷菜单中选择“Options for test.c”命令,如图2所示。
(3)在弹出的如图3所示的“Options for File test.c”对话框中的properties选项卡中,单击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变为黑色(有效)状态,即使“Generate Assembler SRCFile”和“Assembler SRC File”已经被选中。
(4)根据选择的编译模式,把相应的库文件(如Small模式时,是C51\Lib\C51S.Lib)加入工程中,该文件必须作为工程的最后文件;其他模式应选择相应的库文件,Compact模式对应C51\Lib\C51C.Lib,Large模式对应C51\Lib\C51L.Lib文件。
(5)编译后即可生成目标代码。
在View菜单中执行Periodic Windows Update命令,确保Periodic Windows Update前被选择;在Peripherals菜单中执行I/O port子菜单中的Port1和Port2命令,确保Port1和Port2前被选择,如下图6所示。
(6)使用单步执行,观察运行结果,如图6所示。
可以看出,在并行端口1和端口2,其值是不断变化的。
C51与汇编语言混合编程之一
1、函数内部混合编程若想在C 语言函数内部使用汇编语言,应使用以下Cx51 编译器控制命令:
#pragma asm
;;;Assembly code
#pragma endasm
功能作用:
asm 和endasm 命令用于将其标记的汇编程序合并到.SRC 文件中。
这个带有asm 和endasm 块标记的源程序可看作是在线嵌入式汇编程序。
从这点来说,此命令有些类似于#define 命令。
具体实现:
(1)编译器设置及SRC 文件的产生
.SRC 文件在命令行编译模式下是使用SRC 编译器控制命令产生的,在IDE 环境中可以为需要产生SRC 文件的C 源文件设置特定选项:
l 右键单击Project Workspace 下的文件标签
l 选择Options for file 项,打开Options – Properties 页。
l 选中Generate Assembler SRC file 项
l 选中Assembler SRC file 项
(2)添加库文件
根据选择的编译模式,把相应的库文件添加到工程下面,如在small 模式下,需将keil\c51\lib\c51s.lib 文件加入工程中。
在Keil 安装目录下的\C51\LIB\ 目录的LIB 文件如下:
C51S.LIB - 没有浮点运算的Small modelC51C.LIB - 没有浮点运算的。
我找到了一些资料希望对你有用下周就要做实验了,由于听老师说机房位子可能比较少,对我这种蹭课的学生来说也就不敢奢望同选这门课的同学一样能够正常的在机房调试程序了,因此,我决定提前先在自己的工作室里把实验内容给过一遍。
第一个实验是关于嵌入式编程的,这个实验目的一方面是为了让我们熟悉ARM下编程的编译环境ADS和调试器A TX,另一方面是让我们掌握如何将c 语言和汇编语言在实际编程中相互调用。
经过这两天靠自己不断的摸索,终于掌握了如何在编译环境中进行ARM编程,另外,还学会了在c中调用汇编程序的方法,以及如何通过linux 自带的gcc编译嵌有汇编的c程序,总之,收获还是蛮多的哦,下面就总结一下吧。
1、c嵌汇编首先说一下关于GCC编译嵌有汇编语言的c语言吧,GCC编译的汇编语言不是我们上课时学的Intel x86汇编,而是A T&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);}这个程序应该是很简单的,但关键是子函数中嵌入的那段汇编程序,具体的写法可以参看其他文章。
Keil C语言程序设计示例教程(开发C8051F310)使用汇编语言或C语言要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。
KEIL uVISION是众多单片机应用开发软件中最优秀的软件之一,它支持众多不同公司的MCS51架构的芯片,甚至ARM,它集编辑,编译,仿真等于一体,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
因此很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
在这里以51单片机并结合C程序为例(汇编操作方法类似,唯一不同的是汇编源程序文件名后缀为“.ASM ”),图文描述工程项目的创建和使用方法。
1.首先我们要养成一个习惯:最好先建立一个空文件夹,把您的工程文件放到里面,以避免和其他文件混合,如下图, 创建了一个名为“PRJ_C8051”文件夹2.点击桌面上的Keil uVision4图标,出现启动画面:3.点击“project --- New uVision Project”新建一个工程:4.在对话框,选择放在刚才建立的“PRJ_C8051”文件夹下,给这个工程取个名为Test_C8051F310, 然后保存,工程的后缀为uvporj。
5.弹出一个框,在CPU类型下我们找到并选中“Silicon Laboratories. Inc.”下的C8051F3106.加入C8051起动码7.建立一个源程序文本8.在下面空白区别写入或复制一个完整的C程序:9.输入源程序文件名名称,示例输入“Test_C8051F310.c”,然后保存:10.把刚创建的源程序文件加入到工程项目文件中。
11.设置---目标(第1步~ 第4步)15.工程项目创建和设置全部完成!点击保持并编译16.在C8051F310中的C语言程序示例//-----------------------------------------------------------------------------// Includes// 在c8051f310.h在头文件中定义了C8051F310的寄存器、输入/输出的端口//-----------------------------------------------------------------------------#include <c8051f310.h> // SFR declarations//-----------------------------------------------------------------------------// 16-bit SFR Definitions for 'F30x//-----------------------------------------------------------------------------sfr16 TMR2RL = 0xca; // Timer2 reload valuesfr16 TMR2 = 0xcc; // Timer2 counter//-----------------------------------------------------------------------------// Global CONSTANTS//-----------------------------------------------------------------------------#define SYSCLK 24500000 / 8 // SYSCLK frequency in Hzsbit LED = P0^0; // LED='1' means ON//-----------------------------------------------------------------------------// Function PROTOTYPES//-----------------------------------------------------------------------------void SYSCLK_Init (void);void PORT_Init (void);void Timer2_Init (int counts);void Timer2_ISR (void);//-----------------------------------------------------------------------------// MAIN Routine//-----------------------------------------------------------------------------void main (void){// disable watchdog timerPCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer// enable)SYSCLK_Init (); // Initialize system clock to// 24.5MHzPORT_Init (); // Initialize crossbar and GPIOTimer2_Init (SYSCLK / 12 / 10); // Init Timer2 to generate// interrupts at a 10Hz rate.EA = 1; // enable global interruptswhile (1) // spin forever{}}//-----------------------------------------------------------------------------// SYSCLK_Init//-----------------------------------------------------------------------------//// This routine initializes the system clock to use the internal 24.5MHz / 8// oscillator as its clock source. Also enables missing clock detector reset.//void SYSCLK_Init (void){OSCICN = 0x80; // configure internal oscillator for// its lowest frequency RSTSRC = 0x04; // enable missing clock detector }//-----------------------------------------------------------------------------// PORT_Init//-----------------------------------------------------------------------------//// Configure the Crossbar and GPIO ports.// P3.3 - LED (push-pull)//void PORT_Init (void){// assignmentsXBR0 = 0x00; // no digital peripherals selectedXBR1 = 0x40; // Enable crossbar and weak pull-ups//P3MDOUT |= 0x08;P0MDOUT |= 0x03; // enable LED as a push-pull output}//-----------------------------------------------------------------------------// Timer2_Init//-----------------------------------------------------------------------------//// Configure Timer2 to 16-bit auto-reload and generate an interrupt at// interval specified by <counts> using SYSCLK/48 as its time base.//void Timer2_Init (int counts){TMR2CN = 0x00; // Stop Timer2; Clear TF2;// use SYSCLK/12 as timebase CKCON &= ~0x60; // Timer2 clocked based on T2XCLK;TMR2RL = -counts; // Init reload valuesTMR2 = 0xffff; // set to reload immediatelyET2 = 1; // enable Timer2 interruptsTR2 = 1; // start Timer2}//-----------------------------------------------------------------------------// Interrupt Service Routines//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------// Timer2_ISR//-----------------------------------------------------------------------------// This routine changes the state of the LED whenever Timer2 overflows.//void Timer2_ISR (void) interrupt 5{TF2H = 0; // clear Timer2 interrupt flagLED = ~LED; // change state of LED}17.KEIL C语言与汇编语言的混合编程方法C语言中加入汇编语言模块的方法:例子:void func(){C语言代码……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasmC语言代码……}汇编部分需要用#pragma asm和#pragma endasm包起来18.KEIL C混合编程中的错误与解决方法1)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解决方法如下:首先project workspace窗口右键单击包含有汇编部分的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 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中调用即可。
有时候用到需要精确延时之类的子程序时,用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程序的运行做准备工作。
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就知道这中间的一段是汇编了。
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就知道这中间的⼀段是汇编了。
keil软件中C语言嵌套汇编
一、讲解背景在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习。
但是要提高单片机技能,必须掌握C 语言编程,因为C 语言有强大的模块化管理思想。
我想在很多人学习的过程中即学了汇编语言,又学习了C 语言,那么一个问题便随之而产生,如果将C 语言与汇编语言相互结合,达到更好的编程效果,本次讲解就是基于这个问题而生成的。
二、操作步骤
第一步:
在KEIL 中新建工程及文件并复制以下程序并保存为C 文件:
#include
delay()
{
int i,j;
for(i=0;ifor(j=0;j}
main()
{
P2=0x00; //控制8 个LED 亮
delay(); //延时1S
#pragma ASM//汇编嵌套开始
MOV P2,#0FFH //汇编嵌套结束
#pragma ENDASM//汇编嵌套开始。
KEILC51中C语言加入汇编语言的使用方法
一、为什么使用汇编语言?
汇编语言是一种底层的编程语言,其主要目的是实现对硬件的直接控制,具有高度灵活性和效率。
在开发单片机程序时,通常使用高级语言来编写大部分的代码,但是在一些特定的情况下,使用汇编语言能够更好地满足需求,例如对一些硬件寄存器的操作、实现高速计算等。
二、C语言与汇编语言相结合的方法
在KEILC51中,可以通过使用内联汇编或者使用汇编模块的方式将C 语言与汇编语言相结合。
1.内联汇编
内联汇编是将汇编代码直接嵌入到C语言代码中。
使用内联汇编可以获得更高的性能和灵活性,但也增加了代码的可读性和可维护性。
在C语言中使用内联汇编需要使用__asm关键字,并在括号中编写要嵌入的汇编代码。
以下是一个示例:
```
void delay(unsigned int count)
__asm
MOVR1,
loop:
INCR1
CJNE R1, count, loop
}
```
在上述示例中,使用了__asm关键字将一段简单的汇编代码嵌入到了C函数delay中,以实现一个延时功能。
2.汇编模块
另一种将C语言与汇编语言相结合的方法是使用汇编模块。
汇编模块是一个独立的文件,其中包含了汇编语言代码。
可以通过使用extern关键字将C语言代码与汇编模块连接起来。
首先,需要创建一个汇编模块的文件,例如delay.asm,其中包含了要实现的汇编代码:
```
; delay.asm
PUBLIC delay
delay PROC
MOVR1,
loop:
INCR1
CJNE R1, R2, loop
RET
delay ENDP
```
在上述示例中,创建了一个名为delay的汇编函数,该函数实现了一
个简单的延时功能。
接下来,在C语言代码中使用extern关键字声明要调用的汇编函数:```
// main.c
extern void delay(unsigned int count);
void main
delay(1000);
```
在上述示例中,使用extern关键字声明了一个名为delay的汇编函数。
在main函数中,通过调用delay函数可以实现一个简单的延时。
三、总结
通过在KEILC51中使用C语言与汇编语言相结合的方法,可以使单片
机程序具有更好的性能和灵活性。
使用内联汇编可以将汇编代码直接嵌入
到C语言代码中,而使用汇编模块则可以创建独立的汇编文件并与C语言
代码连接起来。
这些方法可以根据具体的需求选择合适的实现方式。