oNOTE https://bbs.21ic.com/?379154 [收藏] [复制] [RSS] Love electron love mcu.  Recording my electronic lives.

日志

51混合编程

已有 428 次阅读2019-12-10 09:43 |个人分类:PIC|系统分类:单片机| 51混合编程, 汇编

预:混合编程一定会遇到C调用汇编,或者汇编调用C;调用可以为程序或者变量。
正解如下:
1.      汇编部分文件格式
$NOMOD51  // 宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。
// 宏与预处理定义
#define xxx        1
// 寄存器的定义
SBUF DATA 0x99
// 位变量段声明
?CONVERBIT       SEGMENT      BIT
//位全局变量声明
PUBLIC           g_bfCompEn            // 多个变量,用“,”分开
// 位变量块制定
RSEG    ?CONVERBIT
// 位变量定义
g_bfCompEn:             DBIT                  1
// data区变量段声明
?CONVERDATAS      SEGMENT   DATA
// 全局变量声明
PUBLIC           g_i16CurA       // 多个变量,用“,”分开
// 变量块制定
RSEG    ?CONVERBIT
// 变量定义
g_i16CurA:                           DS              2                // 这是一个16位变量
// 常量定义
IQ_1_SQRT3      
EQU     49E7H
// 全局函数声明
PUBLIC  Qclarke                                  // 无参数输入
PUBLIC  _IQsinCos_CorDic              // 有参数输入
// 外部变量引用声明
         EXTRN BIT(BackHallFlag)
         EXTRN     
DATA (testd1)                  // 类型 BIT  DATA 
IDATA  XDAA
// 外部函数引用声明
EXTRN CODE(_Pro_test_I_D)          // 有参数输入
EXTRN CODE(Pro_test_I_Nu)          // 无参数输入
// 程序段
?PR?Qpark?CoordinateConversion
SEGMENT CODE        
RSEG    ?PR?Qpark?CoordinateConversion
// 程序部分
Qpark:
           CLR           BackHallFlag
           MOV                  A,#5
           MOV                  testd1,A
           MOV                  R7,#3
           LCALL       _Pro_test_I_D
           MOV                  A,R7
           SETB         BackHallFlag
           LCALL       Pro_test_I_Nu         
           MOV                  A,R7
         
         RET
_IQsinCos_CorDic:
         …
RET
END
对应的H文件声明
// 外部变量声明
extern  bit                 g_bfCompEn;  
extern  signed   int 
data g_i16CurA;
// 外部函数声明
extern  void     Qpark(void);
extern void    IQsinCos_CorDic(signed int op);
2.      变量部分
2.1  汇编定义变量与提供给C文件使用
汇编文件定义
// 位变量段声明
?CONVERBIT       SEGMENT      BIT
// 位全局变量声明
PUBLIC           g_bfCompEn            // 多个变量,用“,”分开
// 位变量块制定
RSEG    ?CONVERBIT
// 位变量定义
g_bfCompEn:             DBIT                  1
// data区变量段声明
?CONVERDATAS      SEGMENT   DATA
// 全局变量声明
PUBLIC           g_i16CurA       // 多个变量,用“,”分开
// 变量块制定
RSEG    ?CONVERBIT
// 变量定义
g_i16CurA:                           DS              2                // 这是一个16位变量
         C文件调用
extern  bit                 g_bfCompEn;  
extern  signed   int 
data g_i16CurA;
2.2  C定义变量同时提供给汇编文件使用
C文件定义
bit data
BackHallFlag;
u8 data testd1;
汇编文件调用
extern  bit                 g_bfCompEn;  
extern  signed   int 
data g_i16CurA;
2.3  
参数传递
参数输入:

参数

8 bit

16 bit

32 bit

一般指针

1

R7

R7,R6

R4~7

R1~3

2

R5

R5,R4

R4~7

R1~3

3

R3

R3,R2

R1~3

参数返回

返回类型

寄存器

说明

1 BIT

CY

通过累加器CY返回

8 BIT

R7


Long 32 BIT

R7~R6

 

Float 32 BIT

R4~7


一般指针

R1~3


3.     程序部分
3.1  汇编程序提供给C文件调用
汇编文件定义
PUBLIC  Qclarke                                    //无参数输入
PUBLIC  _IQsinCos_CorDic                  // 有参数输入
C文件调用
extern  void    Qpark(void);
extern void     IQsinCos_CorDic(signed int op);
3.2  C程序提供给汇编文件调用
C文件定义
u8 Pro_test_I_Nu(void)
{
    testd1 += 1;
    if(testd1 == 10)
    {
             testd1 = 5;
    }
    else
    {
             testd1++;
    }
    return(testd1);
}
u8 Pro_test_I_D(u8 data add)
{
    testd1 += add;
    if(testd1 == 10)
    {
             testd1 = 5;
    }
    else
    {
             testd1++;
    }
    return(testd1);
}
汇编文件调用
EXTRN CODE(_Pro_test_I_D)
EXTRN CODE(Pro_test_I_Nu)
...
LCALL    _Pro_test_I_D
...
LCALL    Pro_test_I_Nu
...


   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
  
   
   
   
   
   
   
   
   
   
   
   
  


  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  



/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:普通表格;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-priority:99;
        mso-style-qformat:yes;
        mso-style-parent:"";
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.5pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        mso-bidi-font-family:"Times New Roman";
        mso-bidi-theme-font:minor-bidi;
        mso-font-kerning:1.0pt;}
table.MsoTableGrid
        {mso-style-name:网格型;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-priority:59;
        mso-style-unhide:no;
        border:solid black 1.0pt;
        mso-border-themecolor:text1;
        mso-border-alt:solid black .5pt;
        mso-border-themecolor:text1;
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-border-insideh:.5pt solid black;
        mso-border-insideh-themecolor:text1;
        mso-border-insidev:.5pt solid black;
        mso-border-insidev-themecolor:text1;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.5pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        mso-bidi-font-family:"Times New Roman";
        mso-bidi-theme-font:minor-bidi;
        mso-font-kerning:1.0pt;}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)