单片机
返回首页

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

2016-07-01 来源:eefocus

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 model
C51C.LIB       - 没有浮点运算的 Compact model
C51L.LIB       - 没有浮点运算的 Large model
C51FPS.LIB    - 带浮点运算的     Small model
C51FPC.LIB    - 带浮点运算的     Compact model
C51FPL.LIB    - 带浮点运算的     Large model

 

若未添加此库文件,则会提示” UNRESOLVED EXTERNAL SYMBOL ”警告。

 

如上设置后,编译,IDE会生成汇编源文件(.SRC)并由汇编器将此文件转化成目标文件(.OBJ)。

 

注意事项:

(1)        此时在汇编语言中虽可以加标签,以执行一些跳转类指令,但要注意不要与编译器产生的其他标签相同。

(2)        在遵循了Cx51参数的调用规则后,如在向该函数传递一char数时,编译器会将其编译成通过R7传递,此时在汇编语言若直接调用R7,会出现定义的变量(形参)未调用警告。

 

 

2、  函数外部混合编程

具体实现:

若要将一完整的函数编写为汇编语言,并可被其它函数调用,此时可以遵循如下过程:

(1)        源文件的建立

新建一C源文件如test.c,将其加入工程中,并写出要实现函数的的哑函数(即写出函数名及形参,不用给出具体实现,但最好写出简单调用形参的代码,使编译器不提示 ”定义的变量未被调用”的警告)。

(2)        从上” 具体过程 ”之(1)。

(3)        从上” 具体过程 ”之(2)。

(4)        编译文件,将test.c 从工程中移除,将生成的test.src文件改名,如test.a51。

(5)        将test.a51加入工程, 并在其内部书写具体要实现的汇编代码。

(6)        重新编译整体文件即可。

 

注意事项:

(1)        调用前一定要在所调用的文件内部声明该函数的存在,写法应同汇编语言的C函数实现一样,即test.c 中的函数名称。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章