发新帖我要提问
12
返回列表
打印

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

[复制链接]
楼主: acmilann
手机看帖
扫描二维码
随时随地手机跟帖
21
acmilann|  楼主 | 2008-6-3 16:56 | 只看该作者 回帖奖励 |倒序浏览

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

使用特权

评论回复
22
ayb_ice| | 2008-6-3 17:21 | 只看该作者

那就再说一下

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

void delay(char i) small// 好象可以直接加在后面,如果不行就用#pragma
{
 i = i;
}

使用特权

评论回复
23
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……………………

使用特权

评论回复
24
wxj1952| | 2008-6-3 22:36 | 只看该作者

修正一下。

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

使用特权

评论回复
25
acmilann|  楼主 | 2008-6-4 00:37 | 只看该作者

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

使用特权

评论回复
26
农民讲习所| | 2008-6-4 07:29 | 只看该作者

这样做:

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

做LIB时,每个函数单独做成C文件。

使用特权

评论回复
27
acmilann|  楼主 | 2008-6-4 08:46 | 只看该作者

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

望赐教

使用特权

评论回复
28
wnwnwn| | 2014-5-12 22:22 | 只看该作者
楼主能把三种传递参数的方式举个例子么?通过编译器的反汇编看是用通用寄存器来传递参数的,那么后两种是怎么实现的呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则