keil函数参数传递能否定位到idata?

[复制链接]
 楼主| acmilann 发表于 2008-6-3 16:56 | 显示全部楼层

在下愚钝,LS大虾能否举个例子

ayb_ice 发表于 2008-6-3 17:21 | 显示全部楼层

那就再说一下

#pragma SAVE
void delay(char i) small;
#pragma RESTORE

void delay(char i) small// 好象可以直接加在后面,如果不行就用#pragma
{
 i = i;
}
 楼主| acmilann 发表于 2008-6-3 21:53 | 显示全部楼层

看看反汇编结果吧

    18: char delay(char  x,char  y,char   z,char idata  w) small 
    19: {return(x+y+z+w); 
C:0x0448    EF       MOV      A,R7
C:0x0449    2D       ADD      A,R5
C:0x044A    2B       ADD      A,R3
C:0x044B    251F     ADD      A,0x1F
C:0x044D    FF       MOV      R7,A
    20: } 

这就是反汇编结果,明显如果small换成compact,w将定位到pdata,换成large将定位到xdata。
还是没法定位到idata……………………
wxj1952 发表于 2008-6-3 22:36 | 显示全部楼层

修正一下。

看了一下Keil使用说明:函数形参确实不能用Idata修饰,只能data--small,而变量(无论全局或局部)可以定位在idata 。形参大概由编译器内存管理,很复杂/严格的最优算法,比如共享、覆盖。一定比用户做得好。
 楼主| acmilann 发表于 2008-6-4 00:37 | 显示全部楼层

我也看过c51手册,没找到明确说不能用Idata修饰

农民讲习所 发表于 2008-6-4 07:29 | 显示全部楼层

这样做:

传递使用结构和结构指针,可以有效减少传递参数。

做LIB时,每个函数单独做成C文件。
 楼主| acmilann 发表于 2008-6-4 08:46 | 显示全部楼层

不知ls说每个函数单独做成c文件有什么好处

望赐教
wnwnwn 发表于 2014-5-12 22:22 | 显示全部楼层
楼主能把三种传递参数的方式举个例子么?通过编译器的反汇编看是用通用寄存器来传递参数的,那么后两种是怎么实现的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部