📄 c51pickfrankasm.htm
字号:
style="FONT-SIZE: 9pt">;用于存放第一个int参数的变量</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">b_v:</SPAN></TD>
<TD width="20%"><SPAN style="FONT-SIZE: 9pt">DS 2
</SPAN></TD>
<TD width="70%"><SPAN
style="FONT-SIZE: 9pt">;用于存放第二个int参数的变量</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">result:</SPAN></TD>
<TD width="20%"><SPAN style="FONT-SIZE: 9pt">DS 1
</SPAN></TD>
<TD width="70%"><SPAN
style="FONT-SIZE: 9pt">;存放func函数char结果的变量</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="10%"></TD>
<TD width="90%"><SPAN
style="FONT-SIZE: 9pt">RSEG
STACK</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="10%"></TD>
<TD width="20%"><SPAN
style="FONT-SIZE: 9pt">DS
20H</SPAN></TD>
<TD width="70%"><SPAN
style="FONT-SIZE: 9pt">;为堆栈保留32个字节</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="10%"></TD>
<TD width="20%"><SPAN
style="FONT-SIZE: 9pt">RSEG
funca51</SPAN></TD>
<TD width="70%"><SPAN
style="FONT-SIZE: 9pt">;funca51代码段起始</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="10%"></TD>
<TD width="90%"><SPAN
style="FONT-SIZE: 9pt">JMP
START</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"><SPAN
style="FONT-SIZE: 9pt">START:</SPAN></TD>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">MOV</SPAN></TD>
<TD width="18%"><SPAN
style="FONT-SIZE: 9pt">SP,#STACK-1</SPAN></TD>
<TD width="63%"><SPAN
style="FONT-SIZE: 9pt">;初始化堆栈</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="28%"><SPAN
style="FONT-SIZE: 9pt">MOV
?func?BYTE+0,a_v+0 </SPAN></TD>
<TD width="63%"><SPAN
style="FONT-SIZE: 9pt">;取第一个int参数</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">MOV</SPAN></TD>
<TD width="81%"><SPAN
style="FONT-SIZE: 9pt">?func?BYTE+1,a_v+1</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">MOV</SPAN></TD>
<TD width="22%"><SPAN
style="FONT-SIZE: 9pt">?func?BYTE+2,b_v+0</SPAN></TD>
<TD width="59%"><SPAN
style="FONT-SIZE: 9pt">;取第二个int参数</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="15%"></TD>
<TD width="85%"></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">MOV</SPAN></TD>
<TD width="22%"><SPAN
style="FONT-SIZE: 9pt">?func?BYTE+3,b_v+1</SPAN></TD>
<TD width="59%"></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">LCALL</SPAN></TD>
<TD width="18%"><SPAN
style="FONT-SIZE: 9pt">func</SPAN></TD>
<TD width="63%"><SPAN
style="FONT-SIZE: 9pt">;调用C函数func</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="10%"><SPAN
style="FONT-SIZE: 9pt">MOV</SPAN></TD>
<TD width="18%"><SPAN
style="FONT-SIZE: 9pt">result,R7</SPAN></TD>
<TD width="63%"><SPAN
style="FONT-SIZE: 9pt">;存取结果</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="9%"></TD>
<TD width="91%"><SPAN
style="FONT-SIZE: 9pt">END</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<P align=justify><SPAN style="FONT-SIZE: 9pt">
分别用C51和A51编译器对上述func51.C和ASM51.A51编译,再执行连接L51
ASM51.OBJ,func51.OBJ
NOOVERLAY,即可实现在ASM51中调用C函数func。连接时选择NOOVERLAY是为了禁止数据段和位段的覆盖。</SPAN><B></P>
<P align=justify><SPAN style="FONT-SIZE: 9pt"><FONT
color=#800080>3.2 在C51中调用汇编程序</FONT></SPAN></B></P>
<P><SPAN style="FONT-SIZE: 9pt">
下面以8051和DS1820接口程序为例来说明在C中调用汇编程序的方法。Dallas公司的DS1820是一种数字式温度计,它与微控制器接口只需一根I/O线,所有的命令、状态和9位温度读数均通过单线双向传送。虽然该器件的硬件接口十分简单,但对读/写时序中的时间片精度要求严格,因而,本例接口程序采用汇编语言编写,主程序及修正温度值的计算部分用C语言编写。本例假定读者对DS1820有所了解,不然请参阅Dallas公司有关DS1820的数据资料。<BR>
以下是8051微控制器与DS1820接口的C源程序,本程序要求8051的P1.0与DS1820连接,工作频率12MHz。清单中error(char)和display(char
*)分别是错误处理和LCD显示处理函数,限于篇幅未给出。</SPAN></P></TD></TR>
<TR>
<TD colSpan=2 width="100%"><SPAN
style="FONT-SIZE: 9pt">#include <reg51.h> </SPAN></TD></TR>
<TR>
<TD colSpan=2 width="100%"><SPAN
style="FONT-SIZE: 9pt">#include <stdio.h> </SPAN></TD></TR>
<TR>
<TD colSpan=2 width="100%"><SPAN
style="FONT-SIZE: 9pt">#include <math.h></SPAN></TD></TR>
<TR>
<TD width="31%"><SPAN style="FONT-SIZE: 9pt">extern
WDS1820(unsigned char x);</SPAN></TD>
<TD width="69%"><SPAN style="FONT-SIZE: 9pt">/*
写DS1820命令外部函数声明 */</SPAN></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="44%"><SPAN style="FONT-SIZE: 9pt">extern
RDS1820(unsigned char *pt);</SPAN></TD>
<TD width="56%"><SPAN style="FONT-SIZE: 9pt">/*
读DS1820数据外部函数声明 */</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="40%"><SPAN style="FONT-SIZE: 9pt">extern bit
RTDS1820(void);</SPAN></TD>
<TD width="60%"><SPAN style="FONT-SIZE: 9pt">/* 复位DS1820外部函数声明
*/</SPAN></TD></TR>
<TR>
<TD width="46%"><SPAN style="FONT-SIZE: 9pt">extern
Delay15(unsigned char n);</SPAN></TD>
<TD width="54%"><SPAN style="FONT-SIZE: 9pt">/* 延时15μs外部函数声明
*/</SPAN></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="28%"><SPAN style="FONT-SIZE: 9pt">sbit
P1_0=P1^0;</SPAN></TD>
<TD width="72%"><SPAN style="FONT-SIZE: 9pt">/*
sbit对象P1.0声明 */</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="28%"><SPAN style="FONT-SIZE: 9pt">void main
(void)</SPAN></TD>
<TD width="72%"><SPAN style="FONT-SIZE: 9pt">/* 主函数
*/</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD colSpan=2 width="100%"><SPAN
style="FONT-SIZE: 9pt">{</SPAN></TD></TR>
<TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -