Keil c与汇编

 在写这片文章之前,写了个试验程序,但总是通不过,查看汇编代码发现c文件中的语句根本没有被编译进去,怎么也找不到原因,郁闷~~ 
      最后在网上搜了个试验程序,把我的程序复制过去,可以编译成功,奇怪了,在我的project里就是不行,我注意到我的project编译后出现一条WARNING:

*** WARNING L7: MODULE NAME NOT UNIQUE
    MODULE:  8.obj (8)

       而同样的程序代码在另外一个project中没有WARNING,肯定是这条WARNING语句导致的,里面提到NAME,难道和名字有关,马上把A51文件改个名字(原来c文件和a51文件名字一样),编译,哈哈,WARNING不见了,查看汇编代码,一切按预想的进行,唉,一个名字害得我不浅啊,记住哦,c文件和A51文件不能使用同一个文件名,不过我还不知道为什么会这样,有高手知道得话请告知,还是进行今天的作业吧!
        今天说说带参数传递的函数调用,在C51和汇编之间传递参数的方式有两种,一种是通过寄存器传递参数,C51中不同类型的实参会存入相应的寄存器,在汇编中只需对相应寄存器进行操作,即达到传递参数的目的。

   不同类型的数据及其传递参数的寄存器如下表所示:
 

参数类型charintlong/float通用指针
第1个R7R6&R7R4-R7R1-R3
第2个R5R4&R5R4-R7R1-R3
第3个R3R2&R3--R1-R3


        举个例子吧,void delay(unsigned char i, unsigned int j)  当执行语句delay(10,1000)时,10会存入R7中,1000高位会存入R4中,低位存入R5中。在汇编语句中从这几个寄存器中取数,再进行操作就行了,说起来也很简单的嘛,呵呵~
       来个最简单的实例吧,没什么意义,傻瓜式的程序:

****************************main.c*********************************************
extern void DELAY(unsigned char i,unsigned int j);

main()
{
DELAY(10,1000);
while(1);
}
**********************DELAY.A51********************************************
?PR?_DELAY?DELAY     SEGMENT CODE
PUBLIC _DELAY
RSEG  ?PR?_DELAY?DELAY
_DELAY:
       DJNZ R4,$
       DJNZ R5,$
       DJNZ R7,$
       RET   
END

还要说的是,函数名前要加下划线,表示是有参数传递的函数调用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值