您的位置:首页 > 编程语言 > C语言/C++

51 C语言与汇编语言混编

2017-06-28 13:45 405 查看
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);

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: