免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3854 | 回复: 4
打印 上一主题 下一主题

大家帮忙看看这段汇编代码有啥问题,内嵌汇编实现的memcpy [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-14 18:27 |只看该作者 |倒序浏览
本帖最后由 sqfasd 于 2011-11-15 09:28 编辑

void memcpy_32(void *dst, void *src, unsigned int size)
{
        __asm
        {
                LDR R1,[dst]
                LDR R2,[src]
                MOV R0,size
                LOOP:
                LDMIA R2!,{R3-R10}
                STMIA R1!,{R3-R10}
                SUBS R0, R0, #32
                BNE LOOP
        }
}
static char data[320*480*2] = {0};
for(i=0;i<10;i++){
                memcpy_32(screen, data, sizeof(data));
}

使用该函数的场景就是将一段存在栈中的320*480*2大小的数据拷贝到指定的显示缓冲区上
编译工具是ads1.2
运行环境是手机平台MTK6236 11A

我遇到的问题是,一运行这段代码,系统就崩溃,屏幕显示fatal error,和一个出错的地址。
好像是内存越界了,问题可能出在LDMIA和STMIA两个指令。
对底层的技术不是太熟,但很有兴趣,求指导

论坛徽章:
0
2 [报告]
发表于 2011-11-14 20:13 |只看该作者
有2点需要确认:
1.你确认size是32的整数倍?
2.SUBS指令会影响标志位Z?

论坛徽章:
0
3 [报告]
发表于 2011-11-15 09:27 |只看该作者
回复 2# garyv


1.可以确定,拷贝数据的大小是32的倍数
2.我试过去掉LDMIA和STMIA两个指令,测试R0确实是等于0的时候结束循环

论坛徽章:
0
4 [报告]
发表于 2011-11-15 11:10 |只看该作者
本帖最后由 garyv 于 2011-11-15 11:15 编辑

将:
LDR R1,[dst]
LDR R2,[src]

替换成:
LDR R1,dst
LDR R2,src

试试,你用ads编译工具不知能否编译通过

还有一点就是,LDM/STM类指令好像要求两个操作数中的寄存器都在R0~R7范围之类,所以上述代码可能有问题,你的编译器没有报错?!

论坛徽章:
0
5 [报告]
发表于 2011-11-15 17:09 |只看该作者
回复 4# garyv


中括号去掉的话编译会报错。
LDM/STM指令编译没有报错,改成R3-R6,一次16个字节,运行还是崩溃。
MTK平台有点奇怪啊,这些代码都是从网上抄来的,别人的ARM都能跑,为啥一到我这就不行了呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP