如何C语言与汇编混编
来源:互联网 发布:c语言实现web服务器 编辑:程序博客网 时间:2024/06/15 13:05
1.在C中内嵌汇编语句
在#pragma asm 与#pragma endasm 中加入要内嵌的汇编语句
例子:
#include <reg52.h>
void main()
{
P0^1=1;
#pragma asm
汇编延时程序
#pragma endasm
P0^1=0;
}
2.C程序调用汇编
(1)C文件格式
C程序调用汇编函数之前必须先用extern对函数加以声明
例子:
#include<reg51.h>
extern void DLY1s();
void main()
{
P2=0xff;
DLY1s();
P2=0;
}
(2)汇编文件格式
用NAME定义模块名,PUBLIC声明为公共函数,RESG为汇编函数起始标志
例子1:
;;************************************ ;Delay time 1s;;************************************ NAME DLY1s ;定义模块名 PUBLIC DLY1s ;声明为公共函数 SEG_DLY1s SEGMENT CODE ;在程序存储区中定义段 USING 1
RSEG SEG_DLY1s ;函数起始位置;;--------------------------DLY1s: SETB RS0 MOV R4,#04HDLY100: MOV R3,#0FFHDLY101: MOV R2,#0FFHDLY102: NOP NOP DJNZ R2,DLY102 DJNZ R3,DLY101 DJNZ R4,DLY100 CLR RS0 RET;;----------------------------------- END例子2:
;;************************************ ;Delay time 10ms;;************************************ NAME DLY10ms PUBLIC DLY10ms SEG_DLY10ms SEGMENT CODE USING 1
RSEG SEG_DLY10ms;;--------------------------DLY10ms: SETB RS0 MOV R3,#32HDLY101: MOV R2,#31HDLY102: NOP NOP DJNZ R2,DLY102 DJNZ R3,DLY101 CLR RS0 RET;;----------------------------------- END
3.汇编调用C函数
(1)汇编文件格式
EXTRN CODE(function) ;声明所要调用的C函数
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:MOV 30H,#5
MOV 31H,#6
CALL function ;调用C函数
MOV P2,32H
END
(2)C文件格式
#include <reg51.h>
#include <absacc.h>
void function()
{
DBYTE[0x32]=DBYTE[0x30]+DBYTE[0x31];
}
注:该方法简单且容易掌握,却有存储空间使用效率低的缺点,但在项目对存储空间需求较低的情况下,该方法是一个不错的选择。
4通过寄存器传递参数的混合调用
相互之间的调用必须满足上述C调汇编和汇编调C的规则
例子1 C调用汇编:
C文件:
#include <reg51.h>unsigned int ADD1(unsigned int a,unsigned int b)void main(){ unsigned int c; c=ADD1(100,100);}
汇编文件:
NAME _ADD1 PUBLIC _ADD1 SEG_ADD1 SEGMENT CODE USING 1 RSEG SEG_ADD1 _ADD1: MOV A,R5 ADD A,R7 MOV R7,A MOV A,R4 ADDC A,R6 MOV R6,A RETEND
注:当通过寄存器传递参数时在汇编里定义函数要用“_函数名”来定义函数
例子2 汇编调用C:
汇编文件:
EXTRN CODE(_function) ;声明所要调用的C函数,通过寄存器则函数为_functionORG 0000HLJMP MAINORG 0030HMAIN: MOV R7,#5 ;把所要传送的值放入响应寄存器单元 MOV R5,#6 CALL _function MOV A,R7 END
C文件:#include <reg51.h> unsigned char function(unsigned char a,unsigned char b){ return(a+b);}
- 如何C语言与汇编混编
- c语言与汇编混编写法
- 51 C语言与汇编语言混编
- 51 C语言与汇编语言混编
- X64平台C/C++与汇编混编工程搭建说明
- 如何实现matlab与c/c++混编
- C语言与汇编
- 汇编与C语言
- 汇编学习-汇编指令与C语言
- Intel 汇编与C语言
- c++与c混编
- C++与C混编
- Lua与C混编
- c语言与汇编语言混编注意事项及参数传递方法
- TX2440 裸跑实验-汇编C语言混编(ADS1.2编译) 进阶(二)
- C++和C语言混编
- C/C++与汇编混编时的内嵌汇编调用C/C++写的函数的演示
- matlab和C如何混编
- 实现Material Design风格的点击水波荡漾效果
- Android点击推送时处理onResume事件extras为null
- matlab cat函数
- HDOJ(HDU).1045 Fire Net (DFS)
- TreeView使用技巧
- 如何C语言与汇编混编
- 在Docker环境下部署Kafka
- 测试用例顺序执行时,若上一个用例未退出iframe,下一个测试用例默认需要一次退出iframe,否则定位iframe出现错误
- 链接知识
- cfg80211 subsystem中的wiphy
- OpenCV学习笔记(05):Mat类详解(二)
- 数字图像去噪典型算法及matlab实现
- ActivityCollectorUtils ~~Activitty管理工具类
- 使用nginx搭建简单的文件服务器