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

如何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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: