打印

哪位朋友能给讲讲循环寻址和位取反寻址吗?

[复制链接]
4104|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianli1980|  楼主 | 2013-8-9 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhangmangui| | 2013-8-10 11:51 | 只看该作者
汇编真心不懂   帮忙顶

使用特权

评论回复
板凳
chenci2013| | 2013-8-10 23:38 | 只看该作者
这个还真不知道的。

使用特权

评论回复
地板
chenci2013| | 2013-8-10 23:38 | 只看该作者
5
aresc| | 2013-8-11 08:40 | 只看该作者
循环寻址,比如定义一个 int circularbuf[100], 当按递增方式寻址到circularbuf[100]时能回到circularbuf[0],有相应的硬件机制可以自己处理这个越界处理,英文单词wrap-around.寻址有两个方向,递增时越界时会回到buf的下边界上,递减时会回到buf的上边界。硬件自己保证访问不会超出这个circularbuf的范围.举个例子:

int *p1 = circularbuf + 99;
int *p2 = circularbuf;
    value1 = *p1++;    // value1 = circularbuf[99], p1指向circularbuf[0];
    value2 = *p2--;    // value1 = circularbuf[0], p2指向circularbuf[99];

更通用的循环寻址描述,看注释部分:
int *p1 = circularbuf + k;  // 0<=k<100
int *p2 = circularbuf + k;  // 0<=k<100
int stride = n;            // 0<n<100;
    value1 = *p1;    // value1 = circularbuf[k]
    p1 += n;         // if (k+n<100), p1 points to circularbuf[k+n], else p1 points to circularbuf[k+n-100];
    value2 = *p2;    // value1 = circularbuf[k]
    p2 -= n;         // if (k-n>=0), p2 points to circularbuf[k-n], else p2 points to circularbuf[k-n+100];

位反序寻址就是做FFT时用的bitreverse,假如一个buffer[8], 那索引值范围为0~7,用二进制表示如下:

index       binary        bit-reverse
0           000           000
1           001           100
2           010           010
3           011           110
4           100           001
5           101           101
6           110           011
7           111           111

0~7用3个二进制位(b2b1b0)可以遍历,比如索引值3,3个二进制位表示为011,即b2=0, b1=1, b0=1,位反序寻址就是寻到索引值为b0b1b2 (b'110)的地址。

使用特权

评论回复
6
simale| | 2013-9-2 15:32 | 只看该作者
aresc 发表于 2013-8-11 08:40
循环寻址,比如定义一个 int circularbuf[100], 当按递增方式寻址到circularbuf[100]时能回到circularbuf[0 ...

位取反寻址还是不太懂,能不能解释的再详细点?我是初学者:L

使用特权

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

本版积分规则

482

主题

2214

帖子

11

粉丝