模块内接口:
使用如下标志符:
#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语言文件:

  1. #include "reg51.h"
  2. extern void DELAY(void);
  3. extern void DEL(void);
  4. void main(void)
  5. {
  6. P1=0x00;
  7. DELAY();
  8. DEL();
  9. P1=0xff;
  10. }

汇编语言文件:

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:

  1. #include "reg52.h"
  2. extern  void delay(void);
  3. sbit    P1_1=P1^1;
  4. void    main(void)
  5. {
  6. P1_1=0;
  7. delay();
  8. P1_1=1;
  9. }

被调用的函数B:

  1. delay()
  2. {
  3. unsigned char i;
  4. i=0;
  5. }

(3)、C51语言中嵌入汇编程序;

在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:

1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。

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

3:用#pragma  asm,和#pragma endasm语句包含嵌入的汇编语言程序。

实例如下:

  1. #include "reg51.h"
  2. void delay(void);
  3. void main(void)
  4. {
  5. void delay(void);
  6. P1=0x00;
  7. #pragma asm
  8. MOV     R3,#08H
  9. DJNZ    R3,$
  10. #pragma endasm
  11. P1=0xff;
  12. }
  13. void delay(void)
  14. {
  15. #pragma asm
  16. MOV     R4,#08H
  17. DJNZ    R4,$
  18. #pragma endasm
  19. }

(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进行汇编的嵌入,例如:

  1. if (sys_ctrl.t_run_num!=sys_ctrl.nt_run_num)
  2. {
  3. __asm PUSH ACC                  //断点数据保存
  4. __asm PUSH B
  5. __asm PUSH PSW
  6. __asm PUSH AR0
  7. __asm PUSH AR1
  8. __asm PUSH AR2
  9. __asm PUSH AR3
  10. __asm PUSH AR4
  11. __asm PUSH AR5
  12. __asm PUSH AR6
  13. __asm PUSH AR7
  14. sys_task[sys_ctrl.t_run_num].task_sp = SP;  //保存栈顶地址
  15. sys_ctrl.t_run_num = sys_ctrl.nt_run_num;   //任务号切换
  16. sys_ctrl.nt_run_num = 0;                    //将新任务号清除便于后续操作
  17. SP = sys_task[sys_ctrl.t_run_num].task_sp;  //获取新任务栈顶地址
  18. __asm POP AR7                   //恢复断点数据
  19. __asm POP AR6
  20. __asm POP AR5
  21. __asm POP AR4
  22. __asm POP AR3
  23. __asm POP AR2
  24. __asm POP AR1
  25. __asm POP AR0
  26. __asm POP PSW
  27. __asm POP B
  28. __asm POP ACC
  29. }

编译时,进入如下对话框,选中其中标出的两项:

 
 

 

KEIL C51程序中如何嵌入汇编的更多相关文章

  1. Keil C51程序设计中几种精确延时方法

    1 使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz.12 MHz或6 MHz晶振.第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确 ...

  2. Keil C51程序调试过程

    用Keil C51编写程序时,经常需要调试,如果不是经常用这个软件的话,很容易忘记这些调试步骤,现在举一个例子“验证延迟函数delay()使其延迟的时间为500ms”说明. 源程序写完后,就可以调试了 ...

  3. KEIL C51 中嵌入汇编以及C51与A51间的相互调用

    如何在 KEIL C51(v6.21) 中调用汇编函数的一个示例 有关c51调用汇编的方法已经有很多帖子讲到,但是一般只讲要点,很少有对整个过程作详细描述,对于初学者是不够的,这里笔者通过一个简单例子 ...

  4. 在C中嵌入汇编

    早前公布了C和汇编混编的温度控制器程序,收到一些朋友的询问,他们无法在自己程序中使用我的18B20的汇编子程序或无法正常通过混编后的程序编译. 其实在KEIL中嵌入汇编的方法很简单.如图一,在C文件中 ...

  5. Hash查找法在Keil C51中的实现

    摘要:散列(hash)是一种重要的存储方法,也是一种常见的查找方法.它是指在记录的存储位置和它的关键字之间建立一个确定的对应关系.本文以射频卡门禁控制器为例,说明用射频卡卡号作为关键字,用Hash查找 ...

  6. Keil C51编译及连接技术

    主要介绍Keil C51的预处理方法如宏定义.常用的预处理指令及文件包含指令,C51编译库的选择及代码优化原理,C51与汇编混合编程的方法与实现以及超过64KB空间的地址分页方法的C51实现. 教学目 ...

  7. KEIL C51高级编程

    第一节 绝对地址访问C51提供了三种访问绝对地址的方法: 1. 绝对宏:在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括:CBYTE.XBYTE.PWORD.DBYTE.CWO ...

  8. keil c51笔记

    第一章 Keil C51开发系统基本知识 第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性. ...

  9. Cortex-M3中C与汇编的交互

          以下内容摘自<ARM Cortex-M3权威指南>         概览       在CM3 上编程,既可以使用C 也可以使用汇编.可能还有其它语言的编译器,但是大多数人还是 ...

随机推荐

  1. Eclipse获取资源路径

    一.问题: 这几天做一个单机版的数据抓取项目,之前都加载了spring或者是maven 使用[this.getClass().getClassLoader().getResource("ma ...

  2. PostgreSQL内存使用增长观察

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackga ...

  3. mfc 类

    知识点 类的概念 类的相关术语 定义类 使用类 一.类的概念 简单的说类就是数据与函数综合体,它是用户自定义类型. 二.类的相关术语 类的实例称为对象. 类在定义中隐式地包含数据和操作函数,这种思想称 ...

  4. python模拟随机游走

    在python中,可以利用数组操作来模拟随机游走. 下面是一个单一的200步随机游走的例子,从0开始,步长为1和-1,且以相等的概率出现.纯Python方式实现,使用了内建的 random 模块: # ...

  5. 【转载】D3DXMatrixLookAtLH视图变换函数详解

    原文:D3DXMatrixLookAtLH视图变换函数详解 /*D3DXMatrixLookAtLH函数返回的是世界->视图变换矩阵. 视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的 ...

  6. 04-cookies 会话跟踪技术

    1.会话跟踪技术 1.Http协议的无状态保存 会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应 2 .会话路径技术使用Cookie或session完成 我们知道HTTP协 ...

  7. metasploit-端口扫描

    大体可以分为两种方式: 1.调用nmap进行端口扫描 msfconsole nmap -v -sV www.cstc.org.cn 扫描结果(端口开放情况以及目标服务操作系统相关操作信息) PORT ...

  8. 约束3:default约束

    默认值约束(Default约束)的作用是在执行insert命令时,如果命令没有显式给指定的列赋值,那么把默认约束值插入到该列中:如果在Insert命令中显式为指定的列赋值,那么将该列插入用户显式指定的 ...

  9. Nginx应用场景

    1. Nginx应用场景 1)http服务器.Nginx可以独立的提供http服务,可以做网页静态服务器(也就是将静态文件放到nginx目录下,通过nginx来访问就ok)   2)虚拟主机,可以在一 ...

  10. Python接口测试实战1(上)- 接口测试理论

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...