如何C语言与汇编混编
2017-02-09 14:26
169 查看
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,#04H
DLY100: MOV R3,#0FFH
DLY101: MOV R2,#0FFH
DLY102: 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,#32H
DLY101: MOV R2,#31H
DLY102: 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
RET
END
注:当通过寄存器传递参数时在汇编里定义函数要用“_函数名”来定义函数
例子2 汇编调用C:
汇编文件:
EXTRN CODE(_function) ;声明所要调用的C函数,通过寄存器则函数为_function
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: 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);
}
在#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,#04H
DLY100: MOV R3,#0FFH
DLY101: MOV R2,#0FFH
DLY102: 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,#32H
DLY101: MOV R2,#31H
DLY102: 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
RET
END
注:当通过寄存器传递参数时在汇编里定义函数要用“_函数名”来定义函数
例子2 汇编调用C:
汇编文件:
EXTRN CODE(_function) ;声明所要调用的C函数,通过寄存器则函数为_function
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: 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);
}
相关文章推荐
- 如何在64位的linux系统上使用汇编和C语言混合编程
- C语言与ARM汇编混编
- C语言编译产生的.OBJ文件和汇编编译产生的.OBJ文件,如何连接_百度知道
- 51 C语言与汇编语言混编
- c语言里如何调用汇编里的变量?
- 基于SDL的四则运算即C语言和汇编语言的混编实验设计总结
- 如何把c语言转成汇编语言[整理]
- c语言中如何调用汇编程序
- c语言中如何调用汇编程序
- 从汇编语言角度看C语言代码,理解计算机如何工作
- c语言与汇编混编写法
- TX2440 裸跑实验-汇编C语言混编(ADS1.2编译) 进阶(二)
- 如何在64位的linux系统上使用汇编和C语言混合编程
- 如何在64位的linux系统上使用汇编和C语言混合编程
- c语言与汇编语言混编注意事项及参数传递方法
- java如何实现类似c语言的条件汇编功能
- 如何将C语言代码转换为对应的汇编代码?
- 51 C语言与汇编语言混编
- 如何在64位的linux系统上使用汇编和C语言混合编程
- 如何在64位的linux系统上使用汇编和C语言混合编程-32汇编移植64位系统