Keil C51中嵌入汇编
KEIL 51 汇编嵌入C语言_WSP
51单片机 KEIL汇编嵌入C语言,程序防干扰设计
WSP QQ:245641047 看过许多资料,有讲解C嵌入汇编的,汇编嵌入C语言,但是不够详细,经过慢慢调试,发现汇编调用C函数,设置很方便,适合初学者学习汇编和C混合调用,并通过设置C文件编译为SRC文件,可起到学习汇编的作用!
下面是我调试时的例子:
文件中包含C函数声明和调用;中断处理语句和出错处理函数以及未用到的程序存储区调用出错处理函数,可防止外部电磁干扰时程序跑飞,进入中断或未使用的入口地址。
程序跑飞有好多种,比如受外部干扰,打开中断,进入中断入口地址;或进入未使用的入口地址,程序一直执行下去;在这种情况下,软件看门狗程序或许也不能是程序跳转到主函数入口地址,需要添加软件抗干扰程序。
闲话就不絮叨了,程序如下:
第一个实例:
汇编文件KEIL_ASM_C.A文件程序:
EXTRN CODE(CALL1) ;声明外部C51函数
ORG 0000H ;程序开始地址
LJMP START ;转START
ORG 0003H ;外中断0中断入口
RETI ;中断返回
ORG 000BH ;定时器T0中断入口
RETI ;返回
ORG 0013H ;外中断1入口地址RETI ;中断返回
ORG 001BH ;定时器T1中断入口
RETI ;中断返回
ORG 0023H ;串行口中断入口
RETI ;中断返回
ORG 002BH ;定时器T2中断入口
RETI ;中断返回
;***************************
;* *
;* 初始化程序 *
;* *
;****************************
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 C语言与汇编语言混合编程之C语言嵌套汇编
keil C语言与汇编语言混合编程之
——在C语言中嵌入汇编语言模块
按以下三步可完成:
1、在C 文件中嵌入汇编代码模块以如下方式加入汇编代码:
#pragma ASM
Asm Code
#pragma ENDASM
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,
点击右边的“Generate Assembler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;单击确定退出。
3、根据选择的编译模式,把相应的库文件(如Small 模式(默认模式)时,是安装目录中Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;
此时工程中如右图所示:
4、编译,即可生成目标代码。
以下为我写的流水灯调试程序,我已经在开发板上正常跑过。#include
#include
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
void main()
{
P1=0xfe;
while(1)
{
#pragma asm
MOV A,P1
RL A
MOV P1,A
#pragma endasm
Delay(1000);
}
}
Keil C语言与汇编混合用
keil C语言与汇编语言混合编程
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>
{
P2=1;
#pragma asm
MOV R7,#10
DEL:MOV R6,#20
DJNZ R6,$
DJNZ R7,DEL
#pragma endasm
P2=0;
}
2 . 无参数传递的函数调用
1.无参数传递的函数调用
先来个例子:其中example.c和example.a51为项目中的两个文件
***********************example.c*********************************************** extern void delay100();
main()
{delay100;}
***********************example.a51*********************************************** ?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段
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、编译,即可生成目标代码。
如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例
有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子对这个过程进行描述,希望能对初学者有所帮助。几年来,在这个论坛里笔者得到很多热心人指导,因此也希望藉此尽一点绵薄之力。
在这个例子里,阐述了编写c51程序调用汇编函数的一种方法,这个外部函数的入口参数是一个字符型变量和一个位变量,返回值是一个整型变量。例中,先用c51写出这个函数的主体,然后用SRC控制指令编译产生asm文件,进一步修改这个asm文件就得到我们所要的汇编函数。该方法让编译器自动完成各种段的安排,提高了汇编程序的编写效率。
step1. 按写普通c51程序方法,建立工程,在里面导入main.c文件和CFUNC.c文件。
相关文件如下:
//main.c文件
#include < reg51.h >
#define uchar unsigned char
#define uint unsigned int
extern uint AFUNC(uchar v_achr,bit v_bflag);
void main()
{
bit BFLAG;
uchar mav_chr;
uint mvintrslt;
mav_chr=0xd4; BFLAG=1;
mvintrslt=AFUNC(mav_chr,BFLAG);
}
//CFUNC.c文件
#define uchar unsigned char
#define uint unsigned int
uint AFUNC(uchar v_achr,bit v_bflag)
[整理版]Keil内联汇编的设置问题
在keil C语言与汇编语言的混合编程中曾经遇到过的一些问题,写下来留作以后参考。(本文写于09.08.15,在8.18日加入了第4点的内容)
2、Keil提示“asm/endasm”出错的解决方法
asm和#pragma endasm包起来
其中红色为C语言部分,绿色为嵌入的汇编语言部分。汇编部分需要用#pragma }
如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...
解决方法如下:
Target not created
sendata.c(87): error C272: 'asm/endasm' requires src-control to be active C语言代码……
sendata.c(81):
{#pragma asm
void func()
1C语言中加入汇编语言模块的方法:
#pragma endasm
MOV R6,#23
例子:
DJNZ R6,DELAY2
RET
DELAY1: DJNZ R7,DELAY1
DELAY2: MOV R7,#191
Project->Option for File‘……’中选择带有红色方框的选项
首先左键单击包含有汇编部分的c语言文件名,然后在菜单栏中选择MODULE: STARTUP.obj (?C_STARTUP)
SYMBOL: ?C_START
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
ADDRESS: 000DH
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
KEILC51中C语言加入汇编语言的使用方法
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
Keil中C语言与汇编语言混合编程
keil C语言与汇编语言混合编程
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
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;}
***********************example.a51***********************************************
关于在 KEIL C51 中直接嵌入汇编
我找到了一些资料希望对你有用
下周就要做实验了,由于听老师说机房位子可能比较少,对我这种蹭课的学生来说也就不敢奢望同选这门课的同学一样能够正常的在机房调试程序了,因此,我决定提前先在自己的工作室里把实验内容给过一遍。第一个实验是关于嵌入式编程的,这个实验目的一方面是为了让我们熟悉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:
#include
Keil C51中汇编的应用
·58·
成本, 同时动态调整标准成本 。ERP 为标准成本理论方法的 应用以及标准成本法与其他成本管理理论和方法结合应用 提供了操作平台, 解决了繁琐的计算。 ERP 系统可以自动计 实际成本、 并将差异自动结转出来, 还 算出产品的标准成本、 可以将差异细分为材料价格差异, 材料用量差异等差异项, 还可以实现把各项成本差异直接落实到各部门甚至个人, 为 。 企业构建责任成本体系提供了基础 目前宝钢成本管理的 核心就是标准成本法, 取得了较好的效果。 ( 二) 建立完善的物流管理系统 。 改善钢铁企业的物流 管理、 降低物流成本在我国尤其具有迫切性 。 原料采购是物 流的首要环节, 企业应谨慎选择供应商, 注重原料的质量和 供应商的信誉。企业可实行供应链管理, 以便与供应商建立 甚至达到单源供应。 为改进存货储存 长期合作的伙伴关系, 结构不合理的问题, 企业应完 善原料采购计划, 改进采购模 。 60 ~ 70% 式 宝钢 的原料通过电子商务实行网上透明采购, “零库存” , 配合网上采购实行虚拟库存和 大大降低库存资金 占用。我国钢铁企业应注重设计顺畅的生产物流路径, 合理 安排生产流程, 减少各环节停工待料发生的几率; 改进运输 管理, 提高运输效率, 减少不必要的物料流动和搬卸费用 。 建立物流管理责任制, 明确物流管理组织内各层次和单位的 职责范围, 加强考核。 ( 三) 塑造适合钢铁企业自身的成本管理文化 。 传统成 本管理运行机制过多地依靠行政手段来增强成本管理的外 在约束力, 难以发挥人们的积极性和创造性, 更谈不上塑造 企业的成本管理文化, 也就不可能在企业内部建立全员成本 管理的理念, 整个成本管理运行机制也就缺乏一种内在的动 力。如何在开展成本管理活动的过程中不断积累成功的管 理经验, 并将其理论化为企业的行动纲领, 进一步形成企业 是企业成本管理活动的重要方面, 而 独有的成本管理文化, 这正是传统成本管理活动所忽视的内容 。 钢铁企业管理实 践中, 培育现代成本管理文化, 可以从以下三个方面入手: 一 是加强领导。企业高级管理者要亲自领导文化的变革, 各个 部门密切配合, 全体员工积极参加; 二是广泛宣传。 为使企 业的文化不仅成为职工的观念, 而且成为一种习惯, 要充分 利用报纸、 电视、 黑板报、 宣传栏进行企业文化的宣传, 使企 业上下形成浓厚的企业文化氛围; 三是通过在企业内部建立 对成本节约行为予以奖励, 对成本浪费 起明确的奖惩制度, 行为予以处罚, 并在实施中予以严格贯彻 。 ( 四) 提高财务人员成本管理素质 , 加强成本管理基础工 作。任何管理活动最终都要由人去完成, 成本管理工作也不 ( 上接第 58 页) ( 一) 汇编文件格式。 EXTRN CODE( _function) ; 声明所要调用的 C 函数, 函数 为_function ORG 0000H MOV R7 , #9 ; 把所要传送的值放入相应的寄存器单元 MOV R5 , #7 CALL_function; 调用 C 函数 MOV A, R7; 所调用的 C 函数的返回值可以从 R7 中读取 END ( 二) C 文件格式。
keil C51直接嵌入汇编的方法
keil C51直接嵌入汇编的方法!!!
上此站以来,得到大家的很多的帮助,感谢大家!特此奉上"点心"一块供大家品尝。希望能增加你营养。
//<asm.h>
#ifdef ASM
unsigned long shiftR1(register unsigned long);
#else
extern 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 asm
clr c
mov a,r4
rrc a
mov r4,a
mov a,r5
rrc a
mov r5,a
mov a,r6
rrc a
mov r6,a
mov a,r7
rrc a
mov r7,a
#pragma endasm
return(x);
}
//end of asm.c
将此源文件加入要编译的工程文件,
将光标指向此文件,选择右键菜单“option for file 'asm.c'”,
将属性单“properties”中的“Generate Assembler SRC File”“Assemble SRC File”
两项设置成黑体的“√”将“Link Public Only”的“√”去掉,再编译即可。
Keil C嵌入汇编的几个问题
一
//
#ifdef ASM
unsigned long shiftR1(register unsigned long);
#else
extern unsigned long shiftR1(register unsigned long);
#endif
//end of asm.h
//
#define ASM
#include
#include
#pragma OT(4,speed)
unsigned long shiftR1(register unsigned long x)
{
#pragma asm
clr c
mov a,r4
rrc a
mov r4,a
mov a,r5
rrc a
mov r5,a
mov a,r6
rrc a
mov r6,a
mov a,r7
rrc a
mov r7,a
#pragma endasm
return(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)锁定
(完整word版)keil C语言与汇编语言混合编程
keil C语言与汇编语言混合编程
1. C语言中嵌入汇编
1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
#pragma ASM;
Assembler Code Here
#pragma ENDASM
2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assem bler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;
3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件;
4、编译,即可生成目标代码。
来个实例吧:
#i nclude
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;}
***********************example.a51***********************************************
keil 中c语言与汇编的嵌套问题
keil 中c语言与汇编的嵌套问题
c语言, 嵌套, keil, 汇编
本帖最后由zhoutao1314 于2009-3-28 10:33 编辑
上次发贴求助这次自己真的是下了功夫把它给弄清楚了
1.第1种情况:直接嵌入汇编
#pragma asm
#pragma endasm
2.第2种情况:文件间调用
在主函数中通过调用文件include"****.h" 来完成或
通过寄存器传递参数,通过固定存储区传递参数。
3.第3种情况:由C生成汇编接口
#pragma SRC
#pragma SMALL
unsigned int asmfunc1 (
unsigned int arg)
{
return (1 + arg);
}
keil 内联汇编格式
keil 内联汇编格式
Keil是一个流行的嵌入式开发环境,用于编写、编译和调试嵌入式系统的程序。在Keil 中,你可以使用内联汇编语言来编写代码。下面是一个简单的内联汇编的例子:
c复制代码
void delay(void)
{
__asm
{
MOV R0, #200000
MOV R1, #0
dly_loop:
SUB R1, R1, #1
CMP R1, #0
BNE dly_loop
}
}
在这个例子中,__asm关键字告诉编译器这是一个内联汇编代码块。在这个代码块中,我们使用MOV指令将200000移动到寄存器R0中,然后将0移动到寄存器R1中。然后我们进入一个循环,每次循环都将R1的值减1,直到R1的值变为0。当R1的值不为0时,我们跳回循环的开始。
注意,具体的汇编指令和语法可能会根据你的处理器和编译器而变化。你需要参考你的硬件和编译器的文档来获取正确的语法和指令。
- 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、编译,即可生成目标代码。