📄 c51pickfrankasm.htm
字号:
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="26%"><SPAN style="FONT-SIZE: 9pt">main:</SPAN></TD>
<TD width="74%"><SPAN
style="FONT-SIZE: 9pt">;主函数代码段起始;</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%"><SPAN style="FONT-SIZE: 9pt">;{</SPAN></TD></TR>
<TR>
<TD width="100%"><SPAN
style="FONT-SIZE: 9pt">;func(0x12,0x34);</SPAN></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 height=18
width="100%"><TBODY>
<TR>
<TD height=18 width="6%"></TD>
<TD height=18 width="20%"><SPAN style="FONT-SIZE: 9pt">MOV
R7,#02H</SPAN></TD>
<TD height=18 width="74%"><SPAN
style="FONT-SIZE: 9pt">;R7传递第一个char参数 <FONT
color=#ff00ff>注:#02H应为#12H</FONT></SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="20%"><SPAN style="FONT-SIZE: 9pt">MOV
R5,#034H</SPAN></TD>
<TD width="74%"><SPAN
style="FONT-SIZE: 9pt">;R5传递第二个char参数</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="20%"><SPAN style="FONT-SIZE: 9pt">LCALL
_func</SPAN></TD>
<TD width="74%"><SPAN
style="FONT-SIZE: 9pt">;调用函数func</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%"><SPAN style="FONT-SIZE: 9pt">;}</SPAN></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="94%"><SPAN
style="FONT-SIZE: 9pt">RET</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%"><SPAN style="FONT-SIZE: 9pt">; uchar func(uchar
x,uchar y)</SPAN></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="28%"><SPAN style="FONT-SIZE: 9pt">RSEG
?PR?_func?ASM_func:</SPAN></TD>
<TD width="66%"><SPAN style="FONT-SIZE: 9pt">;
函数func代码段起始 <FONT color=#ff00ff>注:RSEG
?PR?_func?ASM<BR>
_func:</FONT></SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%"><SPAN style="FONT-SIZE: 9pt">;{</SPAN></TD></TR>
<TR>
<TD width="100%"><SPAN style="FONT-SIZE: 9pt">; return
(x/y);</SPAN></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="20%"><SPAN
style="FONT-SIZE: 9pt">MOV
A,R7</SPAN></TD>
<TD width="74%"><SPAN
style="FONT-SIZE: 9pt">;计算x/y</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="20%"><SPAN
style="FONT-SIZE: 9pt">MOV
B,R5</SPAN></TD>
<TD width="74%"></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="94%"><SPAN
style="FONT-SIZE: 9pt">DIV
AB</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="20%"><SPAN
style="FONT-SIZE: 9pt">MOV
R7,A</SPAN></TD>
<TD width="74%"><SPAN
style="FONT-SIZE: 9pt">;结果经R7返回</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%"><SPAN style="FONT-SIZE: 9pt">; }</SPAN></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="94%"><SPAN style="FONT-SIZE: 9pt">RET
</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="6%"></TD>
<TD width="94%"><SPAN
style="FONT-SIZE: 9pt">END</SPAN></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD width="100%">
<P align=justify><SPAN style="FONT-SIZE: 9pt">
从上列汇编程序可以看出,函数名func前有一个前缀字符“_”,这表明该函数含有寄存器内的参数传递,寄存器R7和R5用来传递参数,计算结果经R7返回。如果在前述的C源文件中用“#pragma
NOREGPARMS”控制命令禁止寄存器内的参数传递,则所有参数均通过固定的存储区域传递。</SPAN></P><B>
<P align=justify><SPAN style="FONT-SIZE: 9pt"><FONT color=#800080>3
应用举例</FONT></SPAN></B></P>
<P align=justify><SPAN style="FONT-SIZE: 9pt"><FONT
color=#800080><B>3.1 汇编中调用C51函数</B></FONT></SPAN></P>
<P><SPAN style="FONT-SIZE: 9pt">
C51源文件func51.C中有一个名为func的函数,它完成某算术运算功能,该C源文件清单如下:<BR>#pragma
NOREGPARMS<BR>#include <reg51.h><BR>#include
<math.h><BR>unsigned char func(unsigned int v_a,unsigned int
v_b)<BR>{<BR>return sqrt(v_a/v_b); /* 计算<IMG
alt="HR5.gif (152 bytes)" height=17
src="c51pickfrankasm.files/hr5.gif" width=76>并返回结果
*/<BR>}<BR> <BR>
该函数需传递两个用于运算的参数,本例用“NOREGPARMS”命令禁止寄存器内的参数传递,即两个参数均在存储器区域内传递,且选择SMALL存储器模式。那么,在汇编中调用该函数的程序清单如下(文件名ASM51.A51):</SPAN></P>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD colSpan=2 width="100%">
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="30%"><SPAN
style="FONT-SIZE: 9pt">EXTRN
CODE (func) </SPAN></TD>
<TD width="70%"><SPAN
style="FONT-SIZE: 9pt">;外部函数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="30%"><SPAN
style="FONT-SIZE: 9pt">EXTRN
DATA
(?func?BYTE)</SPAN></TD>
<TD width="70%"><SPAN
style="FONT-SIZE: 9pt">;外部函数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="30%"><SPAN
style="FONT-SIZE: 9pt">funca51 SEGMENT
CODE</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="30%"><SPAN
style="FONT-SIZE: 9pt">VAR
SEGMENT DATA
</SPAN></TD>
<TD width="70%"><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="30%"><SPAN
style="FONT-SIZE: 9pt">STACK
SEGMENT
IDATA</SPAN></TD>
<TD width="70%"><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="10%"></TD>
<TD width="20%"><SPAN style="FONT-SIZE: 9pt">RSEG
VAR</SPAN></TD>
<TD width="70%"><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="10%"><SPAN
style="FONT-SIZE: 9pt">a_v:</SPAN></TD>
<TD width="20%"><SPAN style="FONT-SIZE: 9pt">DS 2
</SPAN></TD>
<TD width="70%"><SPAN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -