一般利用寄存器传递参数,但是如果参数不够用时候,部分参数在固定存储器传递,此时还依赖寄存器,必定存在传递方式详情的困难获知。有时候干脆用“pragrama noregparms"置顶存储器传递,代码效率低点,但是结构位置清晰。
在主程序中一定要对外部汇编函数进行声明,不要混淆调用声明和函数定义。extern是不可省略的。
在汇编子程序部分分以下3部分:
1、定义模块名。模块名 ?PR?函数名?模块名 。函数名如果在有参传递时候,要前加_号。
模块中:?PR?_函数名?模块名 segment code 一定别忘记声明程序代码
?DT?_函数名 ?模块名 segment overlayable 这边我定义的是局部变量,所以必须加overlayable,反之如果你定义全局变量加overlayable链接定位符号的话,全局变量将发生不可预见的错误数据,正如并非你所想的数据。
2、要定义公共符号
在BASIC语言中,要先声明是公共符号,这边跟BASIC类似,加个PUBLIC公共符号。这样主程序和汇编子程序变量将寻求一致。定义传递的起始位置。
PUBLIC ?函数名?BYTE (一般用字节传递)
RESG ?DT?_函数名?模块名(RESG大家都很清楚,如果用过合泰单片机汇编编程得人明白,在程序段和数据段前都有这个符号进行定位连接)
?_函数名?BYTE
传递先满足参数传递,参数传递不足使用内部数据段传递
为了不长期占用寄存器,在汇编入口处,必须及时转存寄存器参数
TLC549 AD转换器程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay1(uint x);
extern uchar chai;
extern uchar a_func(uchar);
void delay1(uint x) //延时程序
{
uchar tw;
while (x-->0){
for (tw=0;tw<125;tw++){;}
}
}
void main()
{
delay1(10);
EA="0";
chai="a"_func(0); //带参数调用
while(1);
}
汇编程序段
NAME TLC549
?PR?_a_func?TLC549 SEGMENT CODE
?DT?_a_func?TLC549 SEGMENT DATA OVERLAYABLE
?DT?TLC549 SEGMENT DATA
PUBLIC chai
PUBLIC ?_a_func?BYTE
PUBLIC _a_func
RSEG ?DT?_a_func?TLC549
?_a_func?BYTE:
aa:DS 1
RSEG ?DT?TLC549
chai:DS 1
RSEG ?PR?_a_func?TLC549
_a_func:
CLK EQU P1.0
DOUT EQU P1.1
CS EQU P1.2
MOV aa,R7
MOV A ,#aa
CLR CLK
SETB CS
MOV R0,#10H ;延时程序
WAIT: NOP
DJNZ R0,WAIT
CLR CS
NOP
NOP
MOV R1,#08H ;串行转换部分
LOOP: SETB CLK
SETB DOUT
MOV C,DOUT
RLC A
CLR CLK
NOP
NOP
DJNZ R1,LOOP
MOV R7,A ;将结果放入R7中,为返回值
RET
end
tengjingshu_112148725 2009-4-13 09:14