怎么将C语言和汇编混编,如何C语言与汇编混编

1.在C中内嵌汇编语句

在#pragma asm 与#pragma endasm 中加入要内嵌的汇编语句

例子:

#include

void main()

{

P0^1=1;

#pragma asm

汇编延时程序

#pragma endasm

P0^1=0;

}

2.C程序调用汇编

(1)C文件格式

C程序调用汇编函数之前必须先用extern对函数加以声明

例子:

#include

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

#include

void function()

{

DBYTE[0x32]=DBYTE[0x30]+DBYTE[0x31];

}

注:该方法简单且容易掌握,却有存储空间使用效率低的缺点,但在项目对存储空间需求较低的情况下,该方法是一个不错的选择。

4通过寄存器传递参数的混合调用

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

相互之间的调用必须满足上述C调汇编和汇编调C的规则

例子1  C调用汇编:

C文件:

#include 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   unsigned char function(unsigned char a,unsigned char b) {       return(a+b); }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值