预:混合编程一定会遇到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;}