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

合集下载

汇编语言和C语言的混合编程方法分析

汇编语言和C语言的混合编程方法分析
汇编语 言和 C语言 的混合编程方法分析
张丽
( 山西管理 职业学 院,山西 临汾 0 4 1 0 5 1 )

要 :C语 言 虽是高级计算机语言 ,但汇编语言 可以高效率 、高质量地发挥计算机硬 件操作 系统的功能 ,在程序
编 写时将二者有机结合并加以利用,可以事半功倍。
关键词 :汇编语言 ;C语 言;嵌入 ;相互调用 ;程序调 试;混合编程
l 汇编 语言和 C语 言的特 点
1 . 1 汇 编 语 言
汇编语 言是人们 基于初级 计算机语 言 .也就是 二进制 语
2 混合编 程 的注 意事项
2 . 1 注意保护堆栈和寄存器 。以完成参数传 递
汇编语言程 序利用寄存 器来完成 参数信息 的传递 , C语
言的基础 ,将原本 … 0’和 … 1 ’组成 的二进 制字符 串 ,换 用
遇 到 的 问题 l
程 效率 比较 高 ,但 是无法有效 地进行程 序移 植 ,可读 性也较
低。C语言具有丰富 的语言功能 、灵活的表达能力 与较强的可
读 性 ,利 用 C语 言进 行程序 开发 .可 以有效地解决 程序移 植 问题 。单 独使用 c语 言或者 逻辑语 言 ,都有缺憾 .但是可 以 利 用混合 编程 的设 计 ,将二者 有机结 合起来 。充分 发挥逻 辑 语 言和 C语 言各 自的优势 ,保 证程序 的性能完整性 及为后期 的软件维 护带来方便 。
较符合人 类思维 逻辑 的符号来 表达 . 比如 。用 “ A D D ”代 表
加法指令 ,用 “ A D C ”代 表加进位 的加法 指令 .用 “ I N C ”代 表加 1 指令 ,以更 简明的方 式来表达 指令要 求的符 号化计算

Keil软件“C语言”与“汇编”混编——相关知识整理

Keil软件“C语言”与“汇编”混编——相关知识整理

Keil软件“C语言”与“汇编”混编相关知识整理用Keil在C中嵌入汇编 (1)在Keil中嵌入汇编 (2)介绍直接嵌入汇编代码的方法 (4)采用汇编可能会有的好处 (5)Keil C语言与汇编语言混合编程 (7)深入剖析Keil C51 ——从汇编到C51 (9)C语言和汇编语言的变量以及函数的接口问题 (14)汇编与C语言混合编程的关键问题 (15)KEIL段重定位 (15)用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中嵌人汇编了,设置后在文件图示中多了三个红色的小方块。

试验一-2学时keil环境下汇编语言与c语言程序设计

试验一-2学时keil环境下汇编语言与c语言程序设计

实验一汇编语言、C语言程序设计与调试
一、实验目标
1.学习及掌握MCS-51汇编源程序的书写格式和汇编语言、C语言、混合编程的语法规则;
2.学习及掌握Keil C51的软件的基本操作;
3.掌握在Keil C51开发平台上建立、汇编、连接、调试及运行汇编程序的方法和步骤;
4.以示例汇编语言源程序为蓝本,掌握在Keil C51平台上开发单片机应用程序的一般步骤,记录操作过程和结果;
5.学习Keil C51 项目窗口、调试窗口和存储器窗口等常用平台的使用;
6.完成实验报告。

二、实验内容与要求
2.1试验内容
a)采用汇编语言进行程序设计。

要求将定义在ROM区域表格内的16个8位数据搬送至片内RAM区50H~5FH单元中, 求和的结果放在片内RAM区20H (高位), 21H (低位) 的单元中,并在keil下完成汇编、调试;
b)采用C语言进行程序设计。

要求将定义在一维常量数组中的16个8位数据搬送至片内RAM区50H~5FH单元中, 求和的结果放在片内RAM区20H (高位), 21H (低位) 的单元中,并在keil下完成
编译、调试。

2.2试验要求
a)试验可以采用多人协作方式完成,每组协作人数不应超出5人;
b)试验报告应体现完整的试验过程与结果。

三、实验平台
安装有keil集成开发环境的的计算机一台。

四、实验步骤
1、打开keil集成开发环境;
2、建立工程项目;
3、新建汇编源文件或c源文件,并加入到工程中;
4、编辑源代码;
5、编译、链接;
6、调试。

具体试验步骤可参见附件“单片机实验一-汇编与C语言程序设计与调试.pdf”。

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语言相结合的51单片机编程技巧

汇编和C语言相结合的51单片机编程技巧

汇编和C语言相结合的51单片机编程技巧
本文主要是关于汇编和C语言的相关介绍,并着重对汇编和C语言的不同及其编程技巧进行了详尽的阐述。

汇编和C语言C语言和汇编语言的区别在于他们之间优缺点几乎是相反的。

C语言和汇编语言的优缺点:以c来举例
优点:
c的运行效率高;
c可以实现硬件的直接访问;
c代码的移植性好;
缺点:
c的代码复用性差;
c的代码维护性差;
c的扩展性差,即如果想增加新功能,需要修改较多的代码;
c语言的可读性差;
C语言是一门通用计算机编程语言,应用广泛。

C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言;尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

汇编语言:是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。

在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。

在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。

普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。

汇编和C语言相结合的51单片机编程技巧c语言和汇编语言之间主要存在:相互调用、。

keil混合编程

keil混合编程

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与汇编语言混合编程之一

C51与汇编语言混合编程之一

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 - 没有浮点运算的。

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的汇编函数。

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

计算机与现代化 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 语言优点各异,前者对硬件控制方便、程序代码简练、执行效率高,后者功能丰富、可移植性好、可读性强。

为了充分发挥两种语言的优点,使程序更加优化,在单片机程序设计中常会涉及到汇编与C 语言混合编程问题。

汇编与C 语言混合编程的方法可分为两类,一类是在C 程序中嵌入汇编代码,另一类是两种程序以函数的形式相互调用。

C 程序调用汇编和汇编调用C 函数是两种基本的调用方式,具体采用何种方式主要取决于工程对程序的要求。

根据应用实践的具体情况,可将混合编程的基本方法分为以下5种情况。

1 在C 语言程序段中内嵌汇编代码在C51中嵌入汇编代码主要是用于实现延时或中断处理,通常是在汇编程序简练,且内部没有复杂跳转时采用,它是通过使用C51中的一组预处理指令来实现的,具体方法如下:(1)格式要求[1]。

#pragma as m ;汇编程序代码#pragma endas m(2)工程选项设置[2]。

在Pro ject 窗口中,右键点击包含汇编代码的C 文件,选择 Options for... ,然后在弹出的窗口中选中 G enerate Asse mb ler SRC F ile 和 Asse mb le SRC F ile 两项,使检查框由灰色变成黑色。

选中这两项K eil 才会将 as m 与 endas m 中的代码复制到输出的SRC 文件中,SRC 文件为C 文件中对应的汇编文件,也可通过分析SRC 文件了解函数的封装规则。

(3)内嵌汇编代码C 文件实例。

#i nc l ude <reg51.h>vo id m ain(vo i d){44计 算 机 与 现 代 化2010年第10期p2=1;#pragma as m;汇编延时程序#pragma endas mp2=0;}对于在C程序中通过#pragm a as m和#prag m a endas m嵌入的汇编程序,Ke il在编译时不做其它处理,因此不存在参数传递和返回值问题。

2 无参数传递的混合调用在K eil集成开发环境中进行混合编程时,需要在工程中建立两类文件,C文件和汇编文件,其中汇编文件中的函数作为被调用函数时,只要使得该函数遵循C51函数的转换规则,就可以实现相互调用。

2.1C程序调用汇编(1)C文件格式[2]。

C程序在调用汇编函数之前必须先用ex ter n对函数加以声明。

实例m a i n.c如下:#i nclude<reg51.h>ex tern vo i d de lay();//声明此函数为外部函数vo i d m ain(void){P2=0x f;fde l ay();//所调用的汇编函数P2=0;}(2)汇编文件格式[2]。

首先在程序存储区中定义段,接着利用P UBL I C 把函数声明为公共函数,RSEG为汇编函数起始标志符,之后紧接汇编程序。

为了实现程序的相互调用,要求汇编程序必须遵循C51函数名的转换规则,函数必须以 ?PR?函数名?模块名格式命名,否则将无法实现程序的相互调用。

实例delay.as m如下: NAM E ONE;定义模块名?PR?DELAY?ONE SEGM ENT CODE;在程序存储区中定义段PUBL I C DELAY;声明为公共函数R SEG?PR?DELAY?ONE;函数起始位置DELAY:;汇编程序R ETEND2.2汇编调用C函数(1)汇编文件格式。

此时只需要在汇编文件开头用 EXTRN C ODE(函数名)语句来声明所调用的C函数即可。

实例如下: EXTRN CODE(DELAY);声明所要调用的C函数ORG0000HM OV P2,#00HCALL DELAY;调用C函数M OV P2,#FFHEND(2)C文件格式。

在该文件中只需写出所要调用的C函数即可。

#i nc l ude<reg51.h>v iod delay()//在汇编文件中所要调用的延时函数{//C函数语句}该方法主要用于无参数传递的情况,简单且易于掌握。

3 通过约定固定存储空间传递参数的混合调用在51单片机内可在两种语言之间约定 用户RAM区作为参数传递空间。

3.1C程序调用汇编(1)C文件格式。

#i nc l ude<reg51.h>ex tern vo i d de lay();vo id m ain(vo i d){DB YT E[0x30]=0xFF;DB YT E[0x31]=0xFF;P2=0;de l ay();P2=1;}(2)汇编文件格式。

汇编文件通过约定存储区接收C文件传递过来的参数,对参数进行处理。

NAM E T W O?PR?DELAY?TWO SEGM ENT C OD EPU BL IC DELAYR SEG?PR?DELAY?T W ODELAY:M OV R7,#30HDEL:M OV R6,#31HD J N Z R6,$D J N Z R7,DELR ET2010年第10期张志科等:基于K e il 51汇编与C 语言混合编程方法研究45END3.2汇编调用C 函数(1)汇编文件格式。

EXTRN CODE(f uncti on);声明所要调用的C 函数ORG 0000H M OV 30H,#5M OV 31H,#6CALL functi on ;调用C 函数M OV P2,32H END(2)C 文件格式[3]。

#i nclude<reg51.h>#i nclude<absacc .h >//在用绝对地址访问时,必须添加该头文件vo i d f unc tion(vo id){DB YT E[0x32]=DBYTE[0x30]+DBYTE[0x31];}该方法简单且容易掌握,却有存储空间使用效率低的缺点,但在项目对存储空间需求较低的情况下,该方法是一个不错的选择。

4 通过系统编译分配的存储区传递参数的混合调用通过系统编译自动分配存储区地址进行传递参数时,参数段首地址需用段名 ?f u nna m e ?B YTE 和 ?f u nna m e ?B I T 表示,funna m e 为函数名,其中, ?fun na m e ?BI T 传递位参数的段首地址, ?f u nna m e ?B YTE 传递其它参数的段首地址,参数将在这些段中分配空间,按声明的先后在每个段中顺序保存[1]。

该方法多用于C 调用汇编的情况。

以下是该方法的一个实例:(1)C 文件格式。

#i nclude<reg51.h>#pragma NOREGPAR M S //该语句把参数传递约束在固定存储区传递ex tern vo i d de lay(unsi gned i nt i);vo i d m ain(void){de l ay(1000);}(2)汇编文件格式。

?PR?DELAY?DELAYMOD SEGM ENT CODE ;函码段声明?DT?DELAY?DELAYM OD SEGM ENT DATA LAYABLE ;自变量数据段声明PUBL I C DELAY,?DELAY?BYTE ;地址R SEG ?DT?DELAY?DELAYM OD?D ELAY?B YTE:VAR _I :D S 2R SEG ?PR?DELAY?DELAYMOD;//函数可被连接器放置在任何地方DELAY:M OV R 7,?DELAY?BYTE +0;//delay 函数中变量i 的高字节DEL0:MOV R 6,?DELAY?BYTE+1D J N Z R6,$D J N Z R7,DEL0R ET END该方法比较复杂,同样有存储空间使用效率低的缺点,当寄存器不够用时,部分参数必须通过这种方式进行传递(见第5节),因此该方法一般不单独使用。

相关文档
最新文档