Keil中C语言与汇编语言混合编程需要注意的几个地方

合集下载

keil调试 汇编语言

keil调试 汇编语言

keil调试汇编语言首先要介绍一下Keil,Keil是一种专门用于嵌入式系统中的集成开发环境,它可以用来编译,调试和仿真嵌入式系统中的C和汇编程序。

在Keil中调试汇编语言需要掌握几个方面:1. Keil中的窗口在Keil中,有许多窗口可以用来查看或编辑代码,例如Project 窗口、Command窗口、Disassembly窗口等。

其中比较重要的是Debug 窗口,它可以用来监视程序的执行,包括CPU寄存器值、内存地址和指令执行情况等。

同时,它也可以用来设置断点、单步执行程序等调试操作。

2.调试命令在Keil中,有许多调试命令可以用来操作程序的执行。

例如,Step Over可以用来执行当前指令,并移动到下一条指令,Step Into 可以用来进入当前指令所调用的子程序中执行,而Step Out则可以用来退出当前子程序的执行。

除此之外,还有一些命令可以用来设置断点、修改寄存器值等调试操作。

3.汇编指令在调试汇编语言程序时,需要熟悉各种汇编指令的用途和语法。

例如,MOV可以用来将一个值从一个寄存器移动到另一个寄存器中,ADD可以用来将两个值相加并将结果存储到一个寄存器中等等。

同时,还需要了解一些特殊的汇编指令,例如INT可以用来触发中断,JMP可以用来跳转到指定的地址等。

4.内存映像调试汇编语言程序时,可以通过内存映像来查看程序在内存中的执行情况。

在Keil中,可以用Memory窗口来查看各个地址中的值,并根据需要修改它们。

同时,也可以使用Watch窗口来监视某个变量或内存地址的变化,并在程序执行时实时显示它们的值。

总体来说,调试汇编语言程序需要先熟悉Keil中的窗口和调试命令,同时还需要了解汇编指令的语法和用途,并能够使用内存映像来查看程序在内存中的执行情况。

此外,还需要有耐心和细心,仔细观察程序的执行情况,并通过断点和单步执行等操作来排查程序中的问题。

KEIL C51 中 C语言加入汇编语言的使用方法

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只能用在函数内。

汇编语言与c语言混合编程

汇编语言与c语言混合编程

汇编语言与c语言混合编程汇编语言与C语言混合编程是一种程序设计方法,它将汇编语言和C 语言结合起来使用,以实现更高效、更灵活的程序设计。

在这种编程方法中,汇编语言主要用于实现底层操作,而C语言则用于实现高层逻辑。

下面将详细介绍汇编语言与C语言混合编程的基本原理、优点及注意事项。

一、基本原理在汇编语言与C语言混合编程中,通常采用的方法是通过汇编代码调用C函数或者将C函数嵌入到汇编代码中。

具体来说,可以使用以下两种方式:1. 汇编代码调用C函数在这种方式下,首先需要定义一个extern类型的函数声明,并在需要调用该函数的地方使用call指令进行调用。

例如:extern int add(int a, int b);...mov eax, 1mov ebx, 2call add...其中add是一个C函数,在汇编代码中通过extern关键字进行声明,并使用call指令进行调用。

2. 将C函数嵌入到汇编代码中在这种方式下,可以使用asm关键字将一段汇编代码嵌入到C函数中。

例如:int main(){int a = 1;int b = 2;asm("mov eax, %0\n""add eax, %1\n""mov %0, eax\n": "+r" (a): "r" (b): "eax");return a;}在这个例子中,使用asm关键字将一段汇编代码嵌入到了main函数中。

该汇编代码实现了对a和b的相加操作,并将结果保存在a中。

二、优点汇编语言与C语言混合编程具有以下几个优点:1. 提高程序效率汇编语言可以直接操作硬件,因此在需要进行底层操作或者对性能要求较高的场合下,使用汇编语言可以提高程序的效率。

2. 增强程序灵活性C语言具有良好的可移植性和易读性,而汇编语言则具有更高的灵活性。

通过将两者结合起来使用,既可以充分利用C语言的优点,又可以发挥汇编语言的灵活性,从而增强程序的灵活性。

Keil软件“C语言”与“汇编”混编 —— 相关知识整理 (Notepad 语法着色)

Keil软件“C语言”与“汇编”混编 —— 相关知识整理 (Notepad  语法着色)

Keil软件“C语言”与“汇编”混编相关知识整理用Keil在C中嵌入汇编 (1)在Keil中嵌入汇编 (2)介绍直接嵌入汇编代码的方法 (4)采用汇编可能会有的好处 (6)Keil C语言与汇编语言混合编程 (7)深入剖析Keil C51 ——从汇编到C51 (10)C语言和汇编语言的变量以及函数的接口问题 (16)汇编与C语言混合编程的关键问题 (16)KEIL段重定位 (17)用Keil在C中嵌入汇编早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译。

其实在KEIL中嵌入汇编的方法很简单。

如图一,在C文件中要嵌入汇编的地方用#pragma asm和#pragma endasm 分隔开来,这样编译时KEIL就知道这中间的一段是汇编了。

图1在有加入汇编的文件中,还要设置编译该文件时的选项图2Generate Assembler SRC File 生成汇编SRC文件Assemble SRC File 封装汇编文件(如图三的状态为选中)选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。

图3为了能对汇编进行封装还要在项目中加入相应的封装库文件,在笔者的项目中编译模式是小模式所以选用C51S.LIB。

这也是最常用的。

这些库文件是中KEIL安装目录下的LIB目录中。

加好后就可以顺利编译了。

(注:我只在7.0以上版本使用过)图4在Keil中嵌入汇编1、其实在KEIL中嵌入汇编的方法很简单。

如图1,在C文件中要嵌入汇编的地方用#pragma as m和#pragma endasm分隔开来,这样编译时KEIL就知道这中间的一段是汇编了。

2、在有加入汇编的文件中,还要设置编译该文件时的选项,如图2所示。

3、Generate Assembler SRC File 生成汇编SRC文件Assemble SRC File 封装汇编文件(如图3的状态为选中)选上这两项就可以在C中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。

19、KEIL的混合编程操作

19、KEIL的混合编程操作

19、KEIL的混合编程操作2009-03-01 17:44这一篇来讲讲混合编程的问题,在网上找了一下,讲混合编程的文件章也有不少,但进行实例操作讲解的不多也不完整,本来书上混合编程的内容看着就让人觉得抽象难懂,再没有个实际操作图例,就很让人觉得云里雾里。

在这里我就针对KEIL做个混合编程的实例的文章希望对初学者有所帮助。

先搞清几个问题。

①混合编程的必要性:也就是为什么需要混合编程,初学者一定会觉得,我C用的好好的为什么要混进汇编呢,不是自找麻烦吗?其实不然,最简单的例子就是延时子程序,用C写的话连你自己也不知道几层的循环后确切地用多少时间吧?但用汇编写你就能很准确地计算出要延时的时间。

还有当你要对那些时序要求很高IC模块或步进电机行操作时用汇编来写就能做到操控的直接与精准。

②在进行实际操作前要弄清C与汇编之间的调用关系,C的函数大家都会用了,主要分为无反回参数的和有反回参数的,例如 void delay(void);就是无反回参数的,int readdata(void);就是有返回参数的。

还有就是有参数传递和无参数传递的,void delay(void);就是无参数传递的,unsigned int add(unsigned char aa,unsigned char bb);就是有参数传递的函数。

在教材上讲起C与汇编的混合编程就会说起寄存器最多传递三个函数,这样可以产生高效代码。

在参数返回时寄存器的传递规律为:下面我们用实际的混合编程操作来讲讲如何实现函数的调用及参数的传递。

打开KEIL,我的用的版本是绿色免安装2.0中文版,编译器为7.0:无程序代码长度限制。

现在有3.0版也是绿色免安装版本,好处是已支持双字节中文注释,但是英文版。

用哪个版本都无所谓,只要用着习惯功能够用就行。

下面是版本信息:在网上经常有朋友说为什么我下载了KEIL解压出目录后运行却不能编译呢,老是报告出错:--- Error: can't execute 'E:\old_pc\txz001\单片机c51\KEIL4\C51\BIN\C51.EXE'--- 错误: 不能执行 'E:\old_pc\txz001\单片机c51\KEIL2_70\Keil2\C51\BIN\C51.EXE'这是由于编译时,C51.exe编译器没能在你给出的路径上找到。

单片机C语言与汇编混合编程讲解

单片机C语言与汇编混合编程讲解

(1)、C51语言中调用汇编语言程序;C51语言调用汇编语言程序要注意以下几点:1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。

2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\)加入工程中。

3:在C51语言中必须声明需要调用的函数为外部函数。

extern void DELAY(void);4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。

PUBLIC DELAY,DELDELAYY SEGMENT CODERSEG DELAYY实例如下:C51语言文件:#include ""extern void DELAY(void);extern void DEL(void);void main(void){P1=0x00;DELAY();DEL();P1=0xff;}汇编语言文件:PUBLIC DELAY,DELDELAYY SEGMENT CODERSEG DELAYYDELAY: MOV R2,#3HDJNZ R2,$RETDEL: MOV R3,#03HDJNZ R3,$RETEND(2)、C51语言中调用外部的C51函数;C51语言调用外部的C51函数的注意事项如下:1:在主调函数中必须声明被调用的函数为外部类型的函数,其余都一样。

实例如下:主调函数A:#include ""extern void delay(void);sbit P1_1=P1^1;void main(void){P1_1=0;delay();P1_1=1;}被调用的函数B:delay(){unsigned char i;i=0;}(3)、C51语言中嵌入汇编程序;在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。

KEILC51中C语言加入汇编语言的使用方法

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集成开发环境C和汇编语言的相互调用

KEIL C51集成开发环境C和汇编语言的相互调用

KEIL C51集成开发环境C和汇编语言的相互调用
严天峰;王耀琦
【期刊名称】《兰州交通大学学报》
【年(卷),期】2008(027)001
【摘要】目前C语言已成为开发单片机项目的主要工具,但一些特殊的应用场合仍然需要汇编语言编写程序,如编写时序要求非常严格的接口协议时,这必然涉及到C 与汇编的相互调用,即混合编程的问题.详细介绍了KEIL C51环境下的C和汇编语言相互调用的方法和原则,并具体说明混合编程的细节和应注意的问题.
【总页数】4页(P131-134)
【作者】严天峰;王耀琦
【作者单位】兰州交通大学,电子与信息工程学院,甘肃,兰州,730070;兰州交通大学,电子与信息工程学院,甘肃,兰州,730070
【正文语种】中文
【中图分类】TP311.11
【相关文献】
1.Keil C51中C51程序与汇编程序的接口方法 [J], 张玉峰;荀建军
2.基于Keil C51集成开发环境的单片机教学探索 [J], 王青
3.基于Keil C51集成开发环境的单片机教学探索 [J], 王青
4.Keil C51中调用汇编语言的研究与实现 [J], 肖献保;方龙
5.基于80C51和KEIL C51的LED点阵显示系统 [J], 简献忠;虞箐;熊晓君;赵虎;居滋培
因版权原因,仅展示原文概要,查看原文内容请购买。

基于Keil51汇编与C语言混合编程方法研究

基于Keil51汇编与C语言混合编程方法研究

计算机与现代化 2010年第10期JIS UAN JI YU X IAN DA I H UA总第182期文章编号:1006 2475(2010)10 0043 04收稿日期:2010 06 18基金项目:山西省教育厅普通高等学校大学生创新性实验基金资助项目(2008[105])作者简介:张志科(1962 ),男,山西翼城人,忻州师范学院电子系副教授,本科,研究方向:自动控制技术。

基于Keil 51汇编与C 语言混合编程方法研究张志科,王振喜(忻州师范学院电子系,山西忻州034000)摘要:分析基于Ke il 51汇编与C 语言混合编程的基本方法,给出每种方法的具体操作步骤。

在应用实践中,为了充分发挥两种语言的优势,提高程序的执行效率,可根据问题的特殊性选择相应的编程方案,以期达到缩短程序设计过程的目标。

关键词:K e il 51;混合编程;参数传递中图分类号:T P311 文献标识码:A do:i 10.3969/.j i ssn .1006 2475.2010.10.011R esearch onM ixed Progra mm i n g M et hod of C Language andA sse mble Language Based on K eil 51Z HANG Zhi ke ,WANG Zhen x i(D epart m ent of E l ectron i cs ,X i nzhou T eachers Co ll ege ,X i nzhou 034000,Ch i na)Ab stract :T his paper ana l y zes the basic m ethod o f m i xed progra mm ing of C l anguage and assemb l e language based on K e il 51,g i ves the spec ific steps o f each m ethod .In t he app lica ti on practice ,f o r g iv i ng f u ll play t o the advantages o f both l anguag es andi m prov i ng the ex ecuted effic i ency o f progra m s ,it can se lect the appropr i ate progra mm i ng sche m e accord i ng to the spec i a l issue .So it can ach i eve t he goa l o f shorten i ng the process of prog ramm i ng .K ey w ords :K eil 51;m i xed progra mm i ng ;para m eter transfer0 引 言汇编与C 语言优点各异,前者对硬件控制方便、程序代码简练、执行效率高,后者功能丰富、可移植性好、可读性强。

KEIL C51所支持的C语言和汇编语言混合编程的方法

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语言中加入部分汇编语言的代码,分为两种方法。

单片机实验报告KeilC的使用与汇编语言上机操作

单片机实验报告KeilC的使用与汇编语言上机操作

单片机实验报告KeilC的使用与汇编语言上机操作单片机实验报告:Keil C的使用与汇编语言上机操作一、实验目的1.掌握Keil C的使用方法,了解其集成开发环境下的单片机编程流程。

2.掌握汇编语言的基本语法和指令,通过上机操作熟悉其应用。

3.通过实际操作,增强动手能力和解决问题的能力。

二、实验设备1.单片机开发板2.Keil C软件3.电脑及编程器三、实验原理及步骤1.Keil C使用介绍Keil C是一款广泛使用的单片机集成开发环境,它提供了包括编译器、调试器、仿真器等在内的全套开发工具。

使用Keil C可以方便地进行代码编写、编译、调试和模拟,适用于多种单片机开发。

2.汇编语言基础汇编语言是一种直接与硬件相关的编程语言,它通过特定的指令集直接控制硬件进行操作。

汇编语言具有高效、直接的特点,但编写和理解相对困难。

本实验主要学习并熟悉汇编语言的基本语法和指令。

3.实验步骤(1) 在Keil C中创建新项目,选择合适的单片机型号。

(2) 创建源文件,编写汇编程序。

(3) 对源文件进行编译,生成目标文件。

(4) 将目标文件下载到单片机开发板进行调试和运行。

四、实验内容及分析1.在Keil C中创建新项目并选择单片机型号。

在创建项目时,需要选择正确的单片机型号,这将直接影响到程序的编写和运行。

根据实际需要,我们选择了AT89C51作为实验用的单片机。

2.创建源文件并编写汇编程序。

在Keil C中,可以方便地创建新的源文件,并在其中编写汇编程序。

例如,下面是一个简单的汇编程序,用于点亮开发板上的LED灯:MOV P1, #1 // 将1赋值给P1端口此程序将使P1端口的所有引脚输出高电平,从而点亮LED灯。

3.对源文件进行编译并生成目标文件。

在Keil C中,可以通过简单的点击完成编译操作。

编译成功后,将生成一个目标文件(如*.obj文件)。

4.将目标文件下载到单片机开发板进行调试和运行。

在Keil C中,可以通过仿真功能模拟程序的运行,也可以通过调试功能查看程序运行过程中的细节信息。

Keil C嵌入汇编的几个问题

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"也加入工程中。

keil编译c库汇编代码

keil编译c库汇编代码

keil编译c库汇编代码Keil编译器是一款广泛应用于单片机开发的集成开发环境,支持多种编程语言,包括C语言和汇编语言。

在使用Keil编译器进行开发时,有时需要使用C库和汇编代码来完成一些特定的功能。

本文主要介绍如何在Keil编译器中编译C库和汇编代码。

在Keil编译器中编译C库代码时,需要注意以下几点:1. 首先需要将需要使用的C库文件添加到工程中。

可以在Keil 官网下载相应的C库文件,也可以使用自己编写的C库文件。

2. 在Keil编译器中,需要设置C库文件的路径。

具体操作是在工程选项中设置Include Paths和Library Paths。

3. 在代码中使用C库函数时,需要引用相应的头文件。

例如,使用标准输入输出函数时需要包含头文件stdio.h。

4. 在编译C库代码时,需要选择正确的编译选项。

在编译选项中选择Use C Standard,并选择相应的C标准版本。

5. 在链接选项中,需要选择正确的链接库。

例如,使用数学函数时需要选择链接math库。

在Keil编译器中编译汇编代码时,需要注意以下几点:1. 首先需要创建一个汇编文件,扩展名为.asm,并将其添加到工程中。

2. 在代码中使用汇编指令时,需要按照相应的语法书写。

可以使用Keil编译器提供的汇编指令手册来学习汇编指令的使用方法。

3. 在编译汇编代码时,需要选择正确的编译选项。

在编译选项中选择Use ASM,并选择相应的汇编语言版本。

4. 在链接选项中,需要选择正确的链接库。

例如,使用汇编函数时需要选择链接相应的库。

总的来说,在Keil编译器中编译C库和汇编代码需要注意的地方比较多,需要仔细研究相关的文档和手册。

掌握了这些技巧,就可以更加高效地进行单片机程序开发。

KeilC的使用与汇编语言上机操作

KeilC的使用与汇编语言上机操作

《微机实验》报告实验名称KeilC的使用与汇编语言上机操作指导教师曹丹华专业班级 xxxxxxxxxxxxxxx 姓名 xxxxxx 学号 xxxxxxxxxxx联系方式 xxxxxxxxxxxxx一、任务要求1.掌握KeilC环境的使用1)字节拆分、合并:调试e421.asm程序,观察相关寄存器和单元的内容。

2)数据块填充:调试fill.asm程序,观察相关寄存器和单元的内容。

2. 编写两个十六位数的加法程序。

有两个十六位无符号数,分别存放在从20H和30H开始的数据区中,低八位先存,高八位在后,和存于R3(高八位)和R4(低八位),进位位存于R2。

二、设计思路对于16位的两个无符号数做加法,应该先做低8位加法(半加器),再做高8位带进位加法(全加器),最后保存C位。

三、资源分配两个数的低8位存放位置:20H、30H两个数的高8位存放位置:21H、31H程序从0000H开始,做加法过程中将数据存放在R4和R3,完成后将C位转存到R2。

四、流程图五、源代码;这个程序实现了两个16位数:2A10H和0021H相加ORG 50HLJMP MAINORG 0000HMAIN: CLR C ;将进位清零MOV 20H,#10HMOV 21H,#2AHMOV 30H,#21HMOV 31H,#00HMOV R0,20H ;将A中的低位存入R0中MOV A,30H ;将B中的低位存入A累加器中ADDC A,R0 ;将低位相加MOV R4,A ;其和存入R4CLR A ;清零累加器AMOV R0,21H ;将A中的高位存入R0MOV A,31H ;将B中的高位存入A累加器ADDC A,R0 ;将高位以及进位位相加MOV R3,A ;其和存入R3中CLR A ;清零累加器AADDC A,#0 ;将进位存入AMOV R2,A ;将进位存入R2SJMP HERE ;原地踏步END六、程序测试方法与结果、软件性能分析测试采用直接加两个给定的数的方法,检查加法结果和进位是否正常。

(完整word版)keil C语言与汇编语言混合编程

(完整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语言嵌套汇编语言

在KEIL中实现C语言嵌套汇编语言

在KEIL中实现C语言嵌套汇编语言
一、讲解背景
在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习。

但是要提高单片机技能,必须掌握C 语言编程,因为C 语言有强大的模块化管理思想。

我想在很多人学习的过程中即学了汇编语言,又学习了C 语言,那么一个问题便随之而产生,如果将C 语言与汇编语言相互结合,达到更好的编程效果,本次讲解就是基于这个问题而生成的。

二、操作步骤
第一步:
在KEIL 中新建工程及文件并复制以下程序并保存为C 文件:
/*
功能:C 语言里嵌套汇编语言,起到抛砖引玉的作用
作者:三维电子杨荣国
日期:2010-5-16
*/
#include
delay()
{
int i,j;
for(i=0;i for(j=0;j}
main()。

(完整word版)keil C语言与汇编语言混合编程

(完整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混合编程

Keil中汇编和C混合编程

Keil中汇编和C混合编程此⽂系转载⽹友作品,引⽤地址:/mynameislinduan/article/details/8197694,引⽤标题:原⽂摘录:在如上图所⽰的“Source Group 1”上点右键,在菜单中选择 “Add Files to Group 'Source Group 1' ”找到你的KEIL安装⽬录,选择其中的“C51”⽬录下的“LIB”⽬录下的“C51S.LIB”⽂件,点击Add,然后Close即可。

注意,上图所⽰的⽂件选择框进⼊LIB⽬录下后,默认只显⽰.c⽂件,需要在“⽂件类型”中选择“Library file (*.lib)”,即可显⽰LIB⽂件了。

添加C51S.LIB到⼯程后,再次编译,警告信息消失。

linking...Program Size: data=9.0 xdata=0 code=28creating hex file from "sendata"..."sendata" - 0 Error(s), 0 Warning(s).好的,编译⼤功告成了,下载到⽬标板⼦,运⾏ok,这样就好了。

实际上,这个C51S.lib是c与汇编的连⽤的⼀些初始化设定所需要的。

Keil C嵌⼊汇编的⼀些注意事项:上⾯所弄的都可以了,其实keil C的编译器优化是做得蛮聪明的了,例如:; while((PCON&0x20)==0x20);; SOURCE LINE # 812C0119:MOV A,PCONJB ACC.5,?C0119其中绿⾊的是C代码,红⾊的是Keil编译之后的汇编代码。

////////////////////////////////////////////////////////////////////////////////////////////////////现在可以⽤c去做⼀些主要演算主要处理,⽤汇编去做⼀些驱动,中断处理,但是尽管Keil的优化有改进,但是还是有要注意的,有些需要注意的是:从数据存储类型来说,8051系列有⽚内、⽚外程序存储器,分别对应code、data、xdata、idata以及根据51系列特点⽽设定的pdata类型,使⽤不同的存储器,将使程序执⾏效率不同,在编写C51程序时,指定变量的存储类型,这样将有利于提⾼程序执⾏效率。

keil C中C与汇编的交叉编译

keil C中C与汇编的交叉编译

• • • • • • • • •
; SOURCE LINE # 5 MOV A,R7 INC A MOV R7,A ;} ; SOURCE LINE # 6 ?C0001: RET ;END OF _my_assembly_func END
/support/docs/50.htm
/support/man/docs/c51/c51_ap_ctoasm.htm
CALLING ASSEMBLY ROUTINES FROM C
• QUESTION: 从C中调用汇编函数 中调用汇编函数 In the C51 compiler manual, there is example of an assembly module calling a C function. Is there any example of a C program calling an assembly routine? ANSWER: There are no examples in the book, but it is easy to create your own. The asm routine must know how parameters are passed, values returned, and the naming conventions of segments. The steps you must follow to create an example are outlined below: Write a simple function in C that passes parameters and returns values the way you want your assembly routine to. Use the SRC directive (#PRAGMA SRC at the top of the file) so that the C compiler generates a .SRC file instead of a .OBJ file. Compile the C file. Since the SRC directive was specified, the .SRC file is generated. The .SRC file contains the assembly code generated for the C code you wrote. • Rename the .SRC file to a .A51 file. • Edit the .A51 file and insert the assembly code you want to execute into the body of the assembly function shell included in the .A51 file.

keil中混合编程

keil中混合编程

KEIL的混合编程操作——独孤剑客——天嵌通途工作室 C语言可移植性远远要超过汇编,现在一般中大型的软件开发中C语言比汇编用的多。

但是C语言很难写出高时效性的程序。

在51单片机编程中,有时会要求高时效性。

这个时候就需要汇编语言。

本文就是为了解决这一问题,详细介绍了C语言与汇编的混合编程。

网上也有很多有关混合汇编的教程,但是大部分都是不够简单,太抽象。

本文就是用一个实例来一步一步演示。

在演示之前,先要介绍一点理论的东西。

C语言中函数调用大家都会用了。

那么当你调用void delay(void)和void(unsigned int aa)产生的汇编语言到底有什么不同呢?函数的参数又是怎么进行传递的呢?请看下面的表格(基于51单片机);在参数传入时寄存器的传递规律为:在参数返回时寄存器的传递规律为:本文只演示2种混合编程的方法。

下面我们就进入例程演示:方法一:主要针对于只需几句汇编或者少量汇编的情况。

第一步:在keill中编写C程序,在需要写汇编的地方先写两行代码#pragma asm#pragma endasm然后将你要写的汇编的代码插到这两行中间:(如图1)图(1)然后右击你在其中加汇编的那个.c 文件。

会出现下图中的对话框。

选择options for file ****,接着按照图示步骤做就可以了:图(二)图(三)汇编代码就写在这个区域中下一步:装入库文件根据所选择的编译模式, 在工程中添加相应的库文件(如 Small 模式时, 库文件为 C51S.Lib)。

这种方法一般都是选择这个库。

具体操作如下图:图(四)图(五)图(六)完成最后一步:编译与连接。

注意这个文件的图标和其他的不同方法二:把子函数写成汇编文件,然后加入工程中,再进行调用。

这里的汇编不是要你自己真正的去写,你可以先用C语言写一个模板子函数,然后把这个.c文件汇编成汇编程序就可以啦,然后你还可以在汇编程序中进行修改。

看一下演示的过程:第一步:创建void delay()子函数第二步:修改delay.c文件的属性和方法一种的做法是一样的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Keil中C语言与汇编语言混合编程需要注意的几个地方作者 singleywy 日期 2010-11-5 10:05:00 转载自mcu99最终编辑mcu99在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 activesendata.c(87): error C272: 'asm/endasm' requires src-control to be activeTarget not created解决方法如下:首先右键单击包含有汇编部分的c语言文件名,然后在如上图所示的菜单中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。

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即可。

注意,上图所示的文件选择框进入LIB目录下后,默认只显示.c文件,需要在“文件类型”中选择“Library file (*.lib)”,即可显示LIB文件了。

添加C51S.LIB到工程后,再次编译,警告信息消失。

linking...Program Size: data=9.0 xdata=0 code=28creating hex file from "sendata"..."sendata" - 0 Error(s), 0 Warning(s).4、寄存器冲突问题的解决汇编程序块中常常会使用到51的通用寄存器,比如R0-R7。

这种情况下可能会和C语言程序中已经使用到的R0-R7产生冲突,以至于产生一些非常隐蔽和古怪的错误。

虽然有人说KEIL可以自动分配寄存器组使之不产生冲突。

但是在我这里具体测试时还是有冲突的(或者是我的KEIL设置有问题?),下面是测试小程序:/************************************************************** 测试程序*************************************************************/#i nclude<reg51.h>#i nclude<stdio.h>typedef unsigned char uint8 ;uint8 buf[16]={0x55};uint8 i=0 ;/************************************************************* 初始化单片机相关寄存器***********************************************************/void UartInit(){SCON=0x50 ;TMOD|=0x21 ;PCON|=0x80 ;TH1=0xE8 ;TL1=0xE8 ;IE|=0x90 ;TR1=1 ;}/*************************************************** 延时***************************************************/void delay(){#pragma asmMOV R6,#19DELAY2 : MOV R7,#18DELAY1 : DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasm}/*********************************************** 向COM1发送一个字符**********************************************/void SendChar(uint8 byteToSend){SBUF=byteToSend ;while(!TI);TI=0 ;}/************************************************************ * 读取一个字节***********************************************************/uint8 read_byte(){uint8 recvdata=8 ;delay();//延时return recvdata ;}/*************************************************** 主程序***************************************************/int main(){UartInit();//串口初始化while(1){buf[i++]=read_byte();}}/*************************************************** 串口中断处理***************************************************/void chuankou()interrupt 4{if(RI)for(i=0;i<sizeof(buf);i++){SendChar(buf[i]);}RI=0 ;}程序本身非常简单,一目了然。

main函数的作用就是不断把read_byte()的返回值读入buf中,再待有串口中断时,将buf中的内容输出到串口。

read_byte()函数也已经做了简化,返回值固定为8。

将这个程序在KEIL中编译,下载运行。

奇怪的情况出现了,buf中的内容输出到串口总是0(输出理所当然应该是8)。

把delay();这一句注释掉后,程序就输出正常了。

delay();不过起到了一个延时作用而已,怎么可能改变到函数返回值呢?看看read_byte()函数生成的汇编程序USING 0MOV R7,#08HACALL delayRET才晓得,原来read_byte()函数将返回值放到R7中,然后调用delay函数,再返回。

后面的程序调用read_byte()返回值时,直接从R7中取数。

但是“ACALL delay”时,已经存放了#08H的R7,在延时中被递减到了0,这也是为什么buf中存放的内容都是0的缘故。

知道了原因就好办一些了,由于本人是菜鸟,单片机水平很有限,目前只想到了如下4种解决方法:(1)避开C语言部分已经使用了的Rn编汇编模块时,看看C语言部分生成的汇编程序,把那些C语言已经使用到的,且可能对汇编部分构成冲突的Rn避开就好了。

比如上面的延时程序中,把R6、R7换成R3、R4,程序就正常了。

(2)用USING X + ARX的方式调用其他组Rn寄存器51单片机有4组R0-R7的寄存器,据说main中一般使用的都是第0组。

那么在汇编部分中使用其他的组就可以了,delay函数的内容可以改成如下这样:void delay(){#pragma asmUSING 2MOV AR6,#19DELAY2: MOV AR7,#18DJNZ AR6,DELAY2RET#pragma endasm}但是注意,如果这样用的话,delay延时的长度可能需要重新计算。

因为AR6和R6有所不同,以下是在网上找到的两段英文描述:R0 –R7 The eight 8 bit general purpose 8051 registers in the currently active register bank.A Maximum of four register banks are available.AR0 –AR7 Represent the absolute data addresses of R0 through R7 in the current register bank. The absolute address for these registers changes depending on the register bank that is currently selected.These symbols are only available when the USING assembler statement is given.Refer to the USING assembler statement for more information on selecting the register bank. These representations are suppressed by the NOAREGS directive off the Cx51 compiler.看这意思,似乎R0 –R7是寄存器,而AR0 –AR7是地址,所以“MOV AR6,#19”和“MOV R6,#19”所花的时钟周期数是不同的。

相关文档
最新文档