KEIL C51程序中如何嵌入汇编
模块内接口:
使用如下标志符:
#pragma asm
汇编语句
#pragma endasm
注意:如果在c51程序中使用了汇编语言,注意在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 model
C51C.LIB - 没有浮点运算的 Compact model
C51L.LIB - 没有浮点运算的 Large model
C51FPS.LIB - 带浮点运算的 Small model
C51FPC.LIB - 带浮点运算的 Compact model
C51FPL.LIB - 带浮点运算的 Large model 3、在"xx.c"头文件中加入优化:比如#pragma OT(4,speed) 4、在"xx.c"中加入汇编代码
#pragma ASM
;Assembler Code Here
#pragma ENDASM
5、编译生成xx.hex 例:
#include<reg52.h>
void delay(void)
{
#pragma asm
MOV R5,#5
DEL:
MOV R6,#2
DEL1:
MOV R7,#255
DJNZ R7,$
DJNZ R6,DEL1
DJNZ R5,DEL
;MOV A,P1
;CPL 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就知道这中间的一段是汇编了。

在有加入汇编的文件中,还要设置编译该文件时的选项

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

为了能对汇编进行封装还要在项目中加入相应的封装库文件, 在笔者的项目中编译模式是小模式所以选用C51S.LIB。这也是最常用的。这些库文件是中KEIL安装目录下的LIB目录中。 加好后就可以顺利编译了。(注:我只在7.0以上版本使用过)



(1)、C51语言中调用汇编语言程序;
C51语言调用汇编语言程序要注意以下几点:
1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入工程中。
3:在C51语言中必须声明需要调用的函数为外部函数。extern void DELAY(void);
4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
实例如下:
C51语言文件:
- #include "reg51.h"
- extern void DELAY(void);
- extern void DEL(void);
- void main(void)
- {
- P1=0x00;
- DELAY();
- DEL();
- P1=0xff;
- }
汇编语言文件:
PUBLIC DELAY,DEL
DELAYY SEGMENT CODE
RSEG DELAYY
DELAY: MOV R2,#3H
DJNZ R2,$
RET
DEL: MOV R3,#03H
DJNZ R3,$
RET
END
(2)、C51语言中调用外部的C51函数;
C51语言调用外部的C51函数的注意事项如下:
1:在主调函数中必须声明被调用的函数为外部类型的函数,其余都一样。
实例如下:
主调函数A:
- #include "reg52.h"
- 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)文件”和“创建工程(目标)时包含”三个选项。
2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51S.LIB)加入工程中。
3:用#pragma asm,和#pragma endasm语句包含嵌入的汇编语言程序。
实例如下:
- #include "reg51.h"
- void delay(void);
- void main(void)
- {
- void delay(void);
- P1=0x00;
- #pragma asm
- MOV R3,#08H
- DJNZ R3,$
- #pragma endasm
- P1=0xff;
- }
- void delay(void)
- {
- #pragma asm
- MOV R4,#08H
- DJNZ R4,$
- #pragma endasm
- }
(4)、汇编语言中外部子程序的调用
汇编语言中外部子程序的调用
在遍写程序的时候,可以在一个文件的汇编程序中调用另一个文件的子程序。具体的方法如下。
1:在主程序文件中要声明所调用的子程序在外部。比如在主程序中调用子程序名为DELAY的子程序,其格式为:EXTRN CODE (DELAY)
2:在被调用的文件中要声明,被调用的子程序为公共类型的。比如DELAY要声明的格式为:PUBLIC DELAY
3:在被调用的文件中还需要声明此文件是可从新定位的。
SS SEGMENT CODE
RSEG SS
整个事例如下,文件A:
EXTRN CODE (DELAY)
EXTRN CODE (DEL)
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: NOP
TT: MOV P0,#00H
LCALL DELAY
LCALL DEL
MOV P0,#0FFH
LJMP TT
END
文件B:
PUBLIC DELAY
PUBLIC DEL
SS SEGMENT CODE
RSEG SS
DELAY: MOV R2,#3H
DJNZ R2,$
RET
DEL: MOV R3,#03H
DJNZ R3,$
RET
END
(5)采用__asm进行汇编的嵌入,例如:
- if (sys_ctrl.t_run_num!=sys_ctrl.nt_run_num)
- {
- __asm PUSH ACC //断点数据保存
- __asm PUSH B
- __asm PUSH PSW
- __asm PUSH AR0
- __asm PUSH AR1
- __asm PUSH AR2
- __asm PUSH AR3
- __asm PUSH AR4
- __asm PUSH AR5
- __asm PUSH AR6
- __asm PUSH AR7
- sys_task[sys_ctrl.t_run_num].task_sp = SP; //保存栈顶地址
- sys_ctrl.t_run_num = sys_ctrl.nt_run_num; //任务号切换
- sys_ctrl.nt_run_num = 0; //将新任务号清除便于后续操作
- SP = sys_task[sys_ctrl.t_run_num].task_sp; //获取新任务栈顶地址
- __asm POP AR7 //恢复断点数据
- __asm POP AR6
- __asm POP AR5
- __asm POP AR4
- __asm POP AR3
- __asm POP AR2
- __asm POP AR1
- __asm POP AR0
- __asm POP PSW
- __asm POP B
- __asm POP ACC
- }
编译时,进入如下对话框,选中其中标出的两项:
KEIL C51程序中如何嵌入汇编的更多相关文章
- Keil C51程序设计中几种精确延时方法
1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz.12 MHz或6 MHz晶振.第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确 ...
- Keil C51程序调试过程
用Keil C51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子“验证延迟函数delay()使其延迟的时间为500ms”说明. 源程序写完后,就可以调试了 ...
- KEIL C51 中嵌入汇编以及C51与A51间的相互调用
如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子 ...
- 在C中嵌入汇编
早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译. 其实在KEIL中嵌入汇编的方法很简单.如图一,在C文件中 ...
- Hash查找法在Keil C51中的实现
摘要:散列(hash)是一种重要的存储方法,也是一种常见的查找方法.它是指在记录的存储位置和它的关键字之间建立一个确定的对应关系.本文以射频卡门禁控制器为例,说明用射频卡卡号作为关键字,用Hash查找 ...
- Keil C51编译及连接技术
主要介绍Keil C51的预处理方法如宏定义.常用的预处理指令及文件包含指令,C51编译库的选择及代码优化原理,C51与汇编混合编程的方法与实现以及超过64KB空间的地址分页方法的C51实现. 教学目 ...
- KEIL C51高级编程
第一节 绝对地址访问C51提供了三种访问绝对地址的方法: 1. 绝对宏:在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE.XBYTE.PWORD.DBYTE.CWO ...
- keil c51笔记
第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...
- Cortex-M3中C与汇编的交互
以下内容摘自<ARM Cortex-M3权威指南> 概览 在CM3 上编程,既可以使用C 也可以使用汇编.可能还有其它语言的编译器,但是大多数人还是 ...
随机推荐
- Eclipse获取资源路径
一.问题: 这几天做一个单机版的数据抓取项目,之前都加载了spring或者是maven 使用[this.getClass().getClassLoader().getResource("ma ...
- PostgreSQL内存使用增长观察
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackga ...
- mfc 类
知识点 类的概念 类的相关术语 定义类 使用类 一.类的概念 简单的说类就是数据与函数综合体,它是用户自定义类型. 二.类的相关术语 类的实例称为对象. 类在定义中隐式地包含数据和操作函数,这种思想称 ...
- python模拟随机游走
在python中,可以利用数组操作来模拟随机游走. 下面是一个单一的200步随机游走的例子,从0开始,步长为1和-1,且以相等的概率出现.纯Python方式实现,使用了内建的 random 模块: # ...
- 【转载】D3DXMatrixLookAtLH视图变换函数详解
原文:D3DXMatrixLookAtLH视图变换函数详解 /*D3DXMatrixLookAtLH函数返回的是世界->视图变换矩阵. 视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的 ...
- 04-cookies 会话跟踪技术
1.会话跟踪技术 1.Http协议的无状态保存 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2 .会话路径技术使用Cookie或session完成 我们知道HTTP协 ...
- metasploit-端口扫描
大体可以分为两种方式: 1.调用nmap进行端口扫描 msfconsole nmap -v -sV www.cstc.org.cn 扫描结果(端口开放情况以及目标服务操作系统相关操作信息) PORT ...
- 约束3:default约束
默认值约束(Default约束)的作用是在执行insert命令时,如果命令没有显式给指定的列赋值,那么把默认约束值插入到该列中:如果在Insert命令中显式为指定的列赋值,那么将该列插入用户显式指定的 ...
- Nginx应用场景
1. Nginx应用场景 1)http服务器.Nginx可以独立的提供http服务,可以做网页静态服务器(也就是将静态文件放到nginx目录下,通过nginx来访问就ok) 2)虚拟主机,可以在一 ...
- Python接口测试实战1(上)- 接口测试理论
如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...